二分法:两个有序数组长度为N,找到第N、N+1大的数

题目

两个有序数组长度为N,找到第N、N+1大的数

思路1:双指针,O(N)复杂度

简述思路:
如果当前A指针指向的数组A的内容小于B指针指向的数组B的内容,那么A指针往右移动,然后nums(当前已经遍历过的数字个数)也加一。
如果此时已经遍历过的数字个数等于N那么九江移动之前的A指针指向的A数组的内容送入result。
其他情况,以相反的逻辑进行。

//双指针法求解
vector<int> GetMid_On(vector<int>& A, vector<int>& B, int N)
{int A_index = 0;int B_index = 0;int nums = 0;vector<int> result;while (A_index < N && B_index < N){if (A[A_index] < B[B_index]){A_index++;nums++;if (nums == N){result.push_back(A[A_index - 1]);}if (nums == N + 1){result.push_back(A[A_index - 1]);return result;}}else {B_index++;nums++;if (nums == N){result.push_back(B[B_index - 1]);}if (nums == N + 1){result.push_back(B[B_index - 1]);return result;}}//如果两个元素相同}return result;
}int main()
{vector<int> A = { 2,4,5,6,9 };vector<int> B = { 1,3,7,8,10 };vector<int> result = GetMid_On(A, B, 5);cout << result[0] << endl;cout << result[1] << endl;cout << "结束" << endl;return 0;
}

思路2:迭代法二分

简述思路:
先初始化ab数组的start,end,mid;
然后比较各自mid指向的值的大小。
如果A[a_mid] > B[b_mid],说明,第N大的值在A数组a_mid的左边,在B数组b_mid的右边,所以对a_end以及b_start做出更新:
长度为奇数的时候,正好
a_end = a_mid;
b_start = b_mid;
当然还要考虑到长度为偶数的情况:
a_end = a_mid;
b_start = b_mid + 1;
这里只是对start进行修改,对于end值不需要修改。可以举例:
A = {2,4,6,8};
B= {1,3,5,7};
a_start = 0,a_end = 3
b_start = 0,b_end = 3
a_mid = b_mid = 3/2 =1;
A[a_mid] > B[b_mid] ,并且,长度为偶数,所以
a_end = a_mid =1;
b_start = b_mid +1 =2;
所以A被分割为:{2,4};
B被分割为:{5,7};
a_start = 0,a_end = 1
b_start = 2,b_end = 3
a_mid = 1/2 =0;
b_mid = (2+3)/2= 2;
A[a_mid] < B[b_mid] ,并且,长度为偶数,所以
a_start = a_mid =1;
b_end = b_mid =2;
此时达成a_start == a_end || b_start == b_end条件,所以可以判断两个start的值的大小,取较小值可得到第N大的数:

//迭代二分法去解
vector<int> GetMid(vector<int>& A, vector<int>& B, int N)
{vector<int> result;int a_start = 0, a_end = N - 1;int b_start = 0, b_end = N - 1;//初始化中间位置int a_mid = (a_start + a_end) / 2;int b_mid = (b_start + b_end) / 2;//循环结束条件:当数组起始点与结束点重合的时候,说明存在第N大的数while (a_start != a_end || b_start != b_end){//更新中间坐标a_mid = (a_start + a_end) / 2;b_mid = (b_start + b_end) / 2;//如果此时的A中位数与B的中位数相同,说明两个都是第N大的数if (A[a_mid] == B[b_mid]){result.push_back(A[a_mid]);result.push_back(A[a_mid] > B[b_mid] ? B[b_mid]: A[a_mid]);return result;}//如果A的中位数>B的中位数,说明此时第N大的数在A的左边,B的右边,所以需要更新a_end以及b_startelse if (A[a_mid] > B[b_mid]){//如果当前a_start-a_end之间的长度为偶数,那么中间值就是midif ((a_start + a_end) % 2 == 0){a_end = a_mid;b_start = b_mid;}else{a_end = a_mid;b_start = b_mid + 1;}}//如果A的中位数<B的中位数,说明此时第N大的数在A的右边,B的左边,所以需要更新a_start以及b_endelse{//如果当前a_start-a_end之间的长度为奇数,那么中间值就是midif ((a_start + a_end) % 2 == 0){a_start = a_mid;b_end = b_mid;}//如果当前a_start-a_end之间的长度为偶数,那么中间值就是mid+1else{a_start = a_mid + 1;b_end = b_mid;}}}//判断两个start的值的大小if (A[a_start] > B[b_start]){result.push_back(B[b_start]);if (b_start + 1 < N){if (A[a_start] > B[b_start + 1])result.push_back(B[b_start + 1]);elseresult.push_back(A[a_start]);}elseresult.push_back(A[a_start]);}else{result.push_back(A[a_start]);if (a_start + 1 < N){if (A[a_start + 1] <= B[b_start])result.push_back(A[a_start + 1]);elseresult.push_back(B[b_start]);}elseresult.push_back(B[b_start]);}return result;
}int main()
{vector<int> A = { 2,4,5,6,9 };vector<int> B = { 2,4,5,6,9 };//vector<int> B = { 1,3,7,8,10 };vector<int> result = GetMid(A, B, 5);for(int i = 0;i < result.size();i++)cout << result[i] << endl;cout << "结束" << endl;return 0;
}

思路3:递归法二分

写完迭代法之后,递归将a_start,a_end,b_start,b_end,作为递归函数的参数放入。递归函数的一开始写终止条件,参考迭代法。
终止条件后面,写根据中间值的大小,对a_start,a_end,b_start,b_end进行不同赋值,达到分割数组的目的。

//递归二分法求解
vector<int> GetMid(vector<int>& A, vector<int>& B, int a_start,int a_end,int b_start,int b_end,int N)
{vector<int> result;//初始化中间位置int a_mid = (a_start + a_end) / 2;int b_mid = (b_start + b_end) / 2;//如果有答案了if (A[a_mid] == B[b_mid]){result.push_back(A[a_mid]);result.push_back(A[a_mid] > B[b_mid] ? B[b_mid] : A[a_mid]);return result;}if (a_start == a_end || b_start == b_end){//判断两个start的值的大小if (A[a_start] > B[b_start]){result.push_back(B[b_start]);if (b_start + 1 < N){if (A[a_start] > B[b_start + 1])result.push_back(B[b_start + 1]);elseresult.push_back(A[a_start]);}elseresult.push_back(A[a_start]);}else{result.push_back(A[a_start]);if (a_start + 1 < N){if (A[a_start + 1] <= B[b_start])result.push_back(A[a_start + 1]);elseresult.push_back(B[b_start]);}elseresult.push_back(B[b_start]);}return result;}//递归更新边界值if (A[a_mid] > B[b_mid]){//如果当前a_start-a_end之间的长度为偶数,那么中间值就是midif ((a_start + a_end) % 2 == 0){return GetMid(A, B, a_start, a_mid, b_mid, b_end, N);}else{return GetMid(A, B, a_start, a_mid, b_mid + 1, b_end, N);}}//如果A的中位数<B的中位数,说明此时第N大的数在A的右边,B的左边,所以需要更新a_start以及b_endelse{//如果当前a_start-a_end之间的长度为偶数,那么中间值就是midif ((a_start + a_end) % 2 == 0){return GetMid(A, B, a_mid, a_end, b_start, b_mid, N);}else{return GetMid(A, B, a_mid + 1, a_end, b_start, b_mid, N);}}
}int main()
{vector<int> A = { 2,4,5,6,9 };//vector<int> B = { 2,4,5,6,9 };int N = A.size();vector<int> B = { 1,3,7,8,10 };vector<int> result = GetMid(A, B, 0, N-1,0,N-1,N);for(int i = 0;i < result.size();i++)cout << result[i] << endl;cout << "结束" << endl;return 0;
}

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

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

相关文章

Javascript -- In

http://www.caveofprogramming.com/articles/javascript-2/javascript-in-using-the-in-operator-to-iterate-through-arrays-and-objects/ http://msdn.microsoft.com/en-us/library/ie/9k25hbz2(vvs.94).aspx转载于:https://www.cnblogs.com/daishuguang/p/3392310.html

三、自动终止训练

有时候&#xff0c;当模型损失函数值预期的效果时&#xff0c;就可以结束训练了&#xff0c;一方面节约时间&#xff0c;另一方面防止过拟合 此时&#xff0c;设置损失函数值小于0.4&#xff0c;训练停止 from tensorflow import keras import tensorflow as tf import matplo…

矩阵形状| 使用Python的线性代数

Prerequisite: Linear Algebra | Defining a Matrix 先决条件&#xff1a; 线性代数| 定义矩阵 In the python code, we will add two Matrices. We can add two Matrices only and only if both the matrices have the same dimensions. Therefore, knowing the dimensions o…

[数据库]oracle客户端连服务器错误

昨天晚上和今天上午用11g客户端连同事10g服务器&#xff0c;报错&#xff1a; The Network Adapter could not establish the connection 检查尝试了好多次都没好。 用程序连&#xff0c;依旧是报这个错&#xff0c;所以一查就解决了&#xff01; 参考&#xff1a;http://apps…

ASP.NET 抓取网页内容

&#xff08;转&#xff09;ASP.NET 抓取网页内容 ASP.NET 抓取网页内容&#xff0d;文字 ASP.NET 中抓取网页内容是非常方便的&#xff0c;而其中更是解决了 ASP 中困扰我们的编码问题。 需要三个类&#xff1a;WebRequest、WebResponse、StreamReader。 WebRequest、WebRespo…

leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法

题目 给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。 进阶: 如果你…

四、卷积神经网络(Convolution Neural Networks)

一、CNN(Convolution Neural Networks) 卷积神经网络基本思想&#xff1a;识别物体的特征&#xff0c;来进行判断物体 卷积Convolution&#xff1a;过滤器filter中的数值与图片像素值对应相乘再相加&#xff0c;6 * 6卷积一次(步数为1)变成4 * 4 Max Pooling&#xff1a;对卷积…

POJ3096Surprising Strings(map)

题意&#xff1a;输入很多字符串&#xff0c;以星号结束。判断每个字符串是不是“Surprising Strings”&#xff0c;判断方法是&#xff1a;以“ZGBG”为例&#xff0c;“0-pairs”是ZG&#xff0c;GB&#xff0c;BG&#xff0c;这三个子串不相同&#xff0c;所以是“0-unique”…

vs助手使用期过 编译CEGUI的问题:error C2061: 语法错误: 标识符“__RPC__out_xcount_part” VS2010...

第一个问题&#xff0c;下一个破解版的VX_A.dll&#xff0c;将其覆盖以前的dll即可&#xff0c; 但是目录有所要求&#xff0c;如下&#xff1a; XP系统&#xff1a;系统盘\Documents and Settings\用户名\Local Settings\Application win7或者vistaData\Microsoft\VisualStud…

五、项目实战---识别人和马

一、准备训练数据 下载数据集 validation验证集 train训练集 数据集结构如下&#xff1a; 将数据集解压到自己选择的目录下就行 最后的结构效果如下&#xff1a; 二、构建模型 ImageDataGenerator 真实数据中&#xff0c;往往图片尺寸大小不一&#xff0c;需要裁剪成一样…

leetcode 122. 买卖股票的最佳时机 II 思考分析

目录题目贪心法题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必…

css设置a连接禁用样式_使用CSS禁用链接

css设置a连接禁用样式Question: 题&#xff1a; Links are one of the most essential aspects of any web page or website. They play a very important role in making our website or web page quite responsive or interactive. So the topic for discussion is quite pe…

服务器出现 HTTP 错误代码,及解决方法

HTTP 400 - 请求无效 HTTP 401.1 - 未授权&#xff1a;登录失败 HTTP 401.2 - 未授权&#xff1a;服务器配置问题导致登录失败 HTTP 401.3 - ACL 禁止访问资源 HTTP 401.4 - 未授权&#xff1a;授权被筛选器拒绝 HTTP 401.5 - 未授权&#xff1a;ISAPI 或 CGI 授权失败 HTTP 40…

leetcode 55. 跳跃游戏 思考分析

题目 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例1&#xff1a; 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步&#xff0c;从位置 0 到达 位置 1…

六、项目实战---识别猫和狗

一、准备数据集 kagglecatsanddogs网上一搜一大堆&#xff0c;这里我就不上传了&#xff0c;需要的话可以私信 导包 import os import zipfile import random import shutil import tensorflow as tf from tensorflow.keras.optimizers import RMSprop from tensorflow.kera…

修改shell终端提示信息

PS1&#xff1a;就是用户平时的提示符。PS2&#xff1a;第一行没输完&#xff0c;等待第二行输入的提示符。公共设置位置:/etc/profile echo $PS1可以看到当前提示符设置例如&#xff1a;显示绿色&#xff0c;并添加时间和shell版本export PS1"\[\e[32m\][\uyou are right…

java 字谜_计算字谜的出现次数

java 字谜Problem statement: 问题陈述&#xff1a; Given a string S and a word C, return the count of the occurrences of anagrams of the word in the text. Both string and word are in lowercase letter. 给定一个字符串S和一个单词C &#xff0c;返回该单词在文本…

Origin绘制热重TG和微分热重DTG曲线

一、导入数据 二、传到Origin中 三、热重TG曲线 temp为横坐标、mass为纵坐标 绘制折线图 再稍微更改下格式 字体加粗&#xff0c;Times New Roman 曲线宽度设置为2 横纵坐标数值格式为Times New Roman 根据实际情况改下横纵坐标起始结束位置 四、微分热重DTG曲线 点击曲线…

【嵌入式系统复习】嵌入式网络与协议栈

目录开放式系统互连模型总线通信的报文组形式以及传递方式报文组形式报文传递方式网络分配与调度嵌入式TCP/IP蓝牙技术蓝牙的节能状态纠错方案蓝牙协议栈开放式系统互连模型 ISO/OSI七层模型展示了网络结构与各层的功能。 应用层&#xff1a; 提供了终端用户程序和网络之间的应…

代码兼容、技巧

代码兼容、技巧 前端开发中&#xff0c;一个头疼的事&#xff0c;就是代码的不兼容&#xff0c;这里贴出自己在前端开发中的一些解决经验。除了其浏览器本身的BUG外&#xff0c;不建议使用CSS hack来解决兼容性问题的。 IE和FF下对”li“的的高度解析不同 可以不定义高度&#…