首页 > 其他分享 >二分【3】 旋转数组

二分【3】 旋转数组

时间:2024-06-14 23:57:35浏览次数:13  
标签:二分 return int mid 旋转 数组 include

目录

旋转数组

旋转数组找最小值

旋转数组找指定值 

 严格递增序列

递增序列 

旋转序列找中位数:

 


旋转数组

旋转数组找最小值

思路

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100001;int n,num[N]; 
int bis(int a[],int left,int right,int n)
{
while(left<right)
{
	int mid=left+(right-left)/2;
if(a[mid]>a[n-1]) left=mid+1;
else right=mid; 
}
return a[left];	
}


int main()
{
	scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&num[i]);
	
	printf("%d",bis(num,0,n-1,n));
}

旋转数组找指定值 

 严格递增序列

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100001;int n,num[N]; 
int bis(int a[],int left,int right,int n,int x)
{
if 	(x==a[n-1]) return n-1;
if(x<a[n-1])
{
while(left<right)
{
	int mid=left+(right-left)/2;
if(a[mid]>a[n-1] || a[mid]<x) left=mid+1;
if(a[mid]>x && a[mid]<a[n-1] ) right=mid-1;
if(a[mid]==x) return mid; 
}
return a[left]==x?left:-1;	
}
if(x>a[n-1])
{
while(left<right)
{
	int mid=left+(right-left)/2;
if(a[mid]>a[n-1] && a[mid]<x) {left=mid+1;}
if(a[mid]>x || a[mid]<a[n-1] ) {right=mid-1;}
if(a[mid]==x) {return mid;}
	
}
return a[left]==x?left:-1;	
}
}



int main()
{
	scanf("%d",&n);int x;scanf("%d",&x);for(int i=0;i<n;i++) scanf("%d",&num[i]); 
	
	printf("%d",bis(num,0,n-1,n,x));
}

递增序列 

也就是可能有相同值

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100001;int n,num[N]; 
int bis(int a[],int left,int right,int n,int x)
{
if 	(x==a[n-1]) //return n-1;
{if (a[0]==a[n-1]) return 0;
else for(int i=n-1;i>0;i--) if(a[i-1]!=x && a[i]==x) return i;
}
if(x<a[n-1])
{
while(left<right)
{
	int mid=left+(right-left)/2;
if(a[mid]>a[n-1] || a[mid]<x) left=mid+1;
if(a[mid]>x && a[mid]<a[n-1] ) right=mid-1;
if(a[mid]==x) right = mid; 
}
return a[left]==x?left:-1;	
}
if(x>a[n-1])
{
while(left<right)
{
	int mid=left+(right-left)/2;
if(a[mid]>a[n-1] && a[mid]<x) {left=mid+1;}
if(a[mid]>x || a[mid]<a[n-1] ) {right=mid-1;}
if(a[mid]==x) {right = mid;}
	
}
return a[left]==x?left:-1;	
}
}



int main()
{
	scanf("%d",&n);int x;scanf("%d",&x);for(int i=0;i<n;i++) scanf("%d",&num[i]); 
	
	printf("%d",bis(num,0,n-1,n,x));
}

旋转序列找中位数:

找到最小值下标+数组长度/2(?)大概,懒得写了 

双序列中位数

我用了类似归并排序的方法,代价就是时间复杂度O(n/2)

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100001;int n,m,num1[N],num2[N]; 
double s()
{
	int a=0,b=0,l=0,l0=(m+n)/2,num3[l0+1];
	int c=max(m,n);


	while(l<=l0+2 && a<=n-1 &&b<=m-1)
	{
		if(num1[a]<=num2[b]) {num3[l]=num1[a];a++;l++;} 
		else{num3[l]=num2[b];b++;l++;}
		
	}
	if(l<=l0+2)
	{if(a==n) {for(int i=b;i<m&&l<=l0+1;i++){num3[l]=num2[i];l++;}};
	if(b==m) {for(int i=a;i<n&&l<=l0+1;i++){num3[l]=num1[i];l++;}};
	}
	
if((m+n)&1) return num3[l0];else return (double(num3[l0])+num3[l0-1])/2;


	
	
}

int main()
{//printf("%lf",(double)9/2);
	scanf("%d",&n);scanf("%d",&m);for(int i=0;i<n;i++) scanf("%d",&num1[i]); for(int i=0;i<m;i++) scanf("%d",&num2[i]); 
	
	printf("%.1f",s());
}

答案仍然是二分,但我没看懂

#include <cstdio>
#include <algorithm>
using namespace std;

const int MAXN = 100000;
int n, m, a[MAXN], b[MAXN];

int getMax(int a[], int i, int b[], int j) {
    if (i < 0) {
        return b[j];
    }
    if (j < 0) {
        return a[i];
    }
    return max(a[i], b[j]);
}

int getMin(int a[], int i, int b[], int j) {
    if (i >= n) {
        return b[j];
    }
    if (j >= m) {
        return a[i];
    }
    return min(a[i], b[j]);
}

double binarySearch(int n, int a[], int m, int b[]) {
    int leftPartCount = (n + m + 1) / 2;
    int l = 0, r = n;
    while (l < r) {
        int mid = (l + r + 1) / 2;
        int j = leftPartCount - mid;
        if (a[mid - 1] > b[j]) {
            r = mid - 1;
        } else {
            l = mid;
        }
    }
    if ((n + m) % 2) {
        return (double)getMax(a, l - 1, b, leftPartCount - l - 1);
    } else {
        return (getMax(a, l - 1, b, leftPartCount - l - 1) + getMin(a, l, b, leftPartCount - l)) / 2.0;
    }
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    for (int i = 0; i < m; i++) {
        scanf("%d", &b[i]);
    }
    if (n < m) {
        printf("%.1f", binarySearch(n, a, m, b));
    } else {
        printf("%.1f", binarySearch(m, b, n, a));
    }
    return 0;
}

 

 

标签:二分,return,int,mid,旋转,数组,include
From: https://blog.csdn.net/m0_68339197/article/details/139690385

相关文章

  • 请编写一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维函数组,求出
    请编写一个函数voidfun(inttt[M][N],intpp[N]),tt指向一个M行N列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中。二维数组中的数已在主函数中赋予。#include<stdio.h>#defineM3#defineN4voidfun(inttt[M][N],intpp[N]){for(int......
  • 【C语言习题】30.使用指针打印数组内容
    文章目录作业标题作业内容2.解题思路3.具体代码作业标题使用指针打印数组内容作业内容写一个函数打印arr数组的内容,不使用数组下标,使用指针。arr是一个整形一维数组。2.解题思路先定义一个数组,使用指针打印数组内容那就是说我们可以通过对指针解引用,来访问......
  • Java--数组的使用
    1.普通For循环(用的最多,需从中取出数据以及下标)        eg:图中三类问题都可2.For-each循环(一般用来打印一些结果)    eg:打印数组的具体元素3.数组作方法入参(对数组进行一些操作)    eg:可通过参数调用数组4.数组做返回值(对数组进行修改,最后返回一......
  • 下列程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数 fun(int a[][N]),该
    下列程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(inta[][N]),该函数的功能是:使数组左下半三角元素中的值全部置成0。#include<stdio.h>#defineN3voidfun(inta[][N]){for(inti=1;i<N;i++){for(intj=0;j<i;j++){......
  • ts函数组注解
    语法://function(形参:类型,形参n:类型n....):返回值类型{//return内容//}例子:functionadd(a:number,b:number):number{returna+b}letres=add(1,2)letres=add(1,false)//错误 别名语法://type别名=(形参1:类型1,形参n:......
  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【二分查找】2024D-部
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上全网独家的欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例输入输出说明解题思路代码pythonjavacpp时......
  • AcWing 738.数组填充(c++)
    题目描述输入一个整数V,输出一个长度为10的数组N,数组中的第一个元素为V,每个后续元素的值都为上一个元素的值的2倍。例如,如果输入整数为1,则数组为:1,2,4,8…输入格式输入一个整数V。输出格式输出数组中的所有元素,每个元素占一行。输出格式为N[i]=x,其中i为......
  • 代码随想录 算法训练营 day9 Leetcode151 反转字符串单词 karma55 右旋转字符串 28 实
    Leetcode151反转字符串单词题目链接讲解此题方法很多很重要注重基础解法classSolution{publicStringreverseWords(Strings){char[]initialArr=s.toCharArray();//新字符数组char[]newArr=newchar[initialArr.length+1];//下......
  • 【Java】 将字节数组转换为十六进制字符串:Java实现指南
    >>【痕迹】QQ+微信朋友圈和聊天记录分析工具>>(1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。>>(2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。>>(3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。>>下载地......
  • 段错误一定是数组越界吗??写题的时候啥都没变,就改了定义结构体数组的位置就报错!!求大佬
    上题是PTA团体程序设计天梯赛--练习题上的一道题,下面是给的用例我的代码如下#include<stdio.h>typedefstruct {  floatnum;  floatprice;  floatavg;}CAKE;CAKEcake[1010];intmain(){  intN,D;     scanf("%d%d",&N,&D);......