二分法:兩個有序數組長度為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.pswp.cn/news/377647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377647.shtml
英文地址,請注明出處:http://en.pswp.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“的的高度解析不同 可以不定義高度&#…