二分【3】 旋转数组

目录

旋转数组

旋转数组找最小值

旋转数组找指定值 

 严格递增序列

递增序列 

旋转序列找中位数:

 


旋转数组

旋转数组找最小值

思路

#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;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

03通讯录管理系统——菜单功能

功能描述&#xff1a;用户选择功能的界面 菜单界面效果如下图&#xff1a; 步骤&#xff1a; 1.封装函数显示该界面&#xff0c;如void showMenu() 2.在main函数中调用封装好的函数 代码&#xff1a; 运行结果

【INTEL(ALTERA)】Quartus® 软件 Pin Planner 中 Agilex™ 5 FPGA的 HSIO 库可以选择 1.8V VCCIO?

目录 说明 解决方法 说明 由于 Quartus Prime Pro Edition 软件版本 24.1 存在一个问题&#xff0c;Quartus 软件 Pin Planner 中的 I/O 组属性 GUI 允许用户选择 1.8V 作为 HSIO 银行位置的 VCCIO。HSIO bank 支持的有效 VCCIO 电压仅为 1.0V、1.05V、1.1V、1.2V 和 1.3V。…

Java--数组的使用

1.普通For循环&#xff08;用的最多&#xff0c;需从中取出数据以及下标&#xff09; eg&#xff1a;图中三类问题都可 2.For-each循环&#xff08;一般用来打印一些结果&#xff09; eg&#xff1a;打印数组的具体元素 3.数组作方法入参&#xff08;对数组进行一些操作&#x…

蓝牙资讯|苹果iOS 18增加对AirPods Pro 2自适应音频的更多控制

苹果 iOS 18 系统将为 AirPods Pro 2 用户带来一项实用功能 —— 更精细的“自适应音频”控制。AirPods Pro 2 的“自适应音频”功能包含自适应降噪、个性化音量和对话增强等特性&#xff0c;可以根据周围环境自动调节声音和降噪效果。 当更新至最新测试版固件的 AirPods Pro 2…

KVM+GFS分布式存储系统构建高可用群集

KVMGFS 分布式存储系统构建 KVM 高可用群集 一&#xff1a;理论概述 1.1&#xff1a;Glusterfs 简介 Glusterfs 文件系统是由 Gluster 公司的创始人兼首席技术官 Anand Babu Periasamy编写。 一个可扩展的分布式文件系统&#xff0c; 用于大型的、 分布式的、 对大量数据进行访…

泛微开发修炼之旅--15后端开发连接外部数据源,实现在ecology系统中查询其他异构系统数据库得示例和源码

文章链接&#xff1a;15后端开发连接外部数据源&#xff0c;实现在ecology系统中查询其他异构系统数据库得示例和源码

太速科技-4通道 12bit 125Msps 直流耦合 AD FMC 子卡

4通道 12bit 125Msps 直流耦合 AD FMC 子卡 一、板卡概述: FMC 高速 AD 模块 FL9627 为 4 路 125MSPS&#xff0c; 12 位的模拟信号转数字信号模块。 FMC 模块的 AD 转换采用了 2 片 ADI 公司的 AD9627 芯片&#xff0c;每个 AD9627 芯片支持 2 路 AD 输入转换&#x…

Django UpdateView视图

UpdateView是Django中的一个通用视图&#xff0c;用于处理对象的更新操作。它允许用户更新一个已经存在的对象。UpdateView通常与一个模型表单一起使用&#xff0c;这样用户就可以看到当前对象的值&#xff0c;并可以修改它们。 1&#xff0c;添加视图 Test/app3/views.py fr…

云原生化有什么特点?

云原生化&#xff0c;作为一种先进的构建和管理应用程序的方式&#xff0c;不仅代表着技术的革新&#xff0c;更是云计算时代下的必然产物。其核心目标在于充分发掘并发挥云计算平台的各项优势&#xff0c;使应用程序在性能、弹性、可靠性和安全性等方面达到前所未有的高度。 它…

OpenCV图像变换

一 图像的缩放 resize(src,dst,dsize,fx,fy,interpolation) fx&#xff1a;x轴的缩放因子 fy&#xff1a;y轴的缩放因子 interpolation 插值算法 INTER_NEAREST,临近插值&#xff0c;速度快&#xff0c;效果差 INTER_LINEAR,双线性插值&#xff0c;原图中的4个点 INTER_CUBIC…

Redis通用命令

Redis是一种高性能的开源内存数据结构存储&#xff0c;用作数据库、缓存和消息代理。它支持多种数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&#xff08;lists&#xff09;、集合&#xff08;sets&#xff09;及有…

ABB 和PLC ProfinN 通信

1,设置IP 地址 2&#xff0c; 设置站名称 3&#xff0c; 修改传送区大小 4,配置DI DO 5,导出 6&#xff0c;安装gsd 文件 7&#xff0c;建立通信

深度学习笔记: 最详尽估算送达时间系统设计

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 估算送达时间 1. 问题陈述 构建一个模型来估算在给定订单详情、市场条件和交通状况下的总送达时间。 为…

LeetCode | 168.Excel表列名称

这道题一开始以为是简单的进制转换问题&#xff0c;用的以往的思路&#xff0c;对于一般性的进制转换题目&#xff0c;只需要不断地对 columnNumber 进行 % 运算取得最后一位&#xff0c;然后对 columnNumber 进行 / 运算&#xff0c;将已经取得的位数去掉&#xff0c;直到 col…

ZYNQ7 Processing System IP核中PS侧Uart的用法

在ZYNQ7 Processing System IP核中集成的UART控制器是一个中全双工异步接收器和发送器&#xff0c;支持广泛的可编程波特率和I/O信号格式&#xff0c;可以适应自动奇偶校验生成和多主机检测模式。 UART操作由配置和模式寄存器控制。使用状态寄存器、中断状态寄存器和调制解调器…

JVM原理之运行时数据区域

Java运行时数据区(Runtime Data Area)是Java虚拟机(JVM)在运行Java程序时内部维护的一系列数据区域。这些区域共同协作,确保Java程序能够高效、稳定地运行。本文将详细介绍Java运行时数据区的结构和作用。 java虚拟机运行时数据区域 根据《Java虚拟机规范》规定,jvm内存…

【网安AIGC专题】46篇前沿代码大模型论文、24篇论文阅读笔记汇总

网安AIGC专题 写在最前面一些碎碎念课程简介 0、课程导论1、应用 - 代码生成2、应用 - 漏洞检测3、应用 - 程序修复4、应用 - 生成测试5、应用 - 其他6、模型介绍7、模型增强8、数据集9、模型安全 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻…

EasyGBS服务器和终端配置

服务器配置 修改easygbs.ini sip/host为本机IP&#xff0c;否则终端能登录&#xff0c;无法视频。 [sip] host192.168.3.190 终端用于登录的用户名和密码 default_usertest default_passwordtest1234 default_guest_userguest default_guest_passwordtest1234终端配置 关…

【Postman的接口测试工具介绍】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Excel最基本的常用函数

最基本最常用的函数&#xff0c;掌握了可以解决大部分问题。 (笔记模板由python脚本于2024年06月11日 19:05:56创建&#xff0c;本篇笔记适合熟悉excel的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣…