3Sum Closest從數列中找到三個數之和最接近給定值
即求min{ target - a -b -c } a,b,c blog to Set S;
(一)最簡單的做法當然是求出所有的不相同的三個數和,儲存到set裡,然後用target,target (+/-) i ,i [0....]
複雜度基本上可以算是O(n^3)。
int threeSumClosest(vector<int> &num, int target) { int n=num.size(); if(n<3) return 0; unordered_set<int> sum; for(int i=0 ; i<n; ++i) for(int j=i+1;j<n; ++j) for(int k=j+1; k<n;++k){ int key = num[i]+num[j]+num[k]; sum.insert(key); } int lap=0; while(true){ if(sum.find(target+lap)!=sum.end()) return target+lap; else if (sum.find(target-lap)!=sum.end()) return target-lap; lap++; } }
(二)有了簡單解法,我們自然要優化。
(1)三重迴圈肯定是可以幹掉的,即先把兩數之和和它們對應的下標存到map裡。
(2)然後再用陣列的數去map裡對映,最初是a[i] +0 , 然後是a[i] +1 ,依次增加,總會找到的。
(3)這樣基本上算是O(N^2)了。
int threeSumClosest(vector<int> &num, int target) { int n=num.size(); if(n<3) return 0; unordered_map<int,pair<int,int>> num0; for(int i=0 ; i<n; ++i) for(int j=i+1;j<n; ++j){ int key = target-num[i]-num[j]; num0.insert(make_pair(key,make_pair(i,j))); } int lap=0; while(true){ for(int i=0 ; i< num.size();++i){ if( num0.find(num[i]+lap)!=num0.end() && i!=num0[num[i]+lap].first &&i!=num0[num[i]+lap].second ) return target-lap; else if(num0.find(num[i]-lap)!=num0.end() && i!=num0[num[i]-lap].first &&i!=num0[num[i]-lap].second ) return target+lap; } lap++; } }
相關推薦
3Sum Closest從數列中找到三個數之和最接近給定值
即求min{ target - a -b -c } a,b,c blog to Set S; (一)最簡單的做法當然是求出所有的不相同的三個數和,儲存到set裡,然後用target,target (+/-) i ,i [0....] 複雜度基本上可以算是O(n^3)。 in
面試題:從給定的N個正數中選取若干個數之和最接近M
這道題跟撈魚問題一樣,都是剛進實驗室新生培訓那會兒做過的題目,不過這個是一師姐當時找工作的面試題。 如題,並輸出該子序列 測試用例:2,9,5,7,4,11,10 分別輸出最接近33、40、47、60的子序列 分析:N個數之和接近M,將M看做一個容量
從給定的N個正數中選取若干個數之和最接近M
解法:轉換成01揹包問題求解,從正整數中選取若干個數放在容量為M的揹包中。 可以用01揹包的一維陣列進行求解。 程式程式碼: #include<stdio.h> const int MA
16. 3Sum Closest(找出和最接近給定值的三個數)
Given an array S of n integers, find three integers in S such that the sum is closest to a given numb
16.3SumClosest(找出和最接近給定值的三個數)
userinfo 個數 www. lan targe store 3sum str aaa tfof5n忌膠沈歐弛覆http://t.docin.com/sina_6267209377so4ec6可呢洶頁匾儆http://shufang.docin.com/kpa339ii
從HashMap中找出出現次數最多的鍵
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.
leetcode-java.T016_threeSumClosest---給定包含n個整數陣列S,找到S中的三個整數,從而使之和最接近給定的數,返回三個整數的總和.
<span style="color:#ff4635">敬請關注部落格,後期不斷更新優質博文,謝謝</span> package leetcode.T016_threeSumClosest; import java.util.Arrays; i
N個正數選取若干個數之和最接近M
問題描述:給定N個正數(A1,、A2、A3、...、AN),從中選取若干(k)個數,使得這些數之和最接近M。 演算法分析:最接近可能有兩種情況,一種是k個數之和小於M,另一種是k個數之和大於M,所以問題可看成兩個01揹包問題(揹包容量分別為M和A1+A2+A3+...+AN
從陣列中找出乘積最大的三個數
題目: 給定一個無序陣列,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間複雜度:O(n),空間複雜度:O(1) 輸入描述: 無序整數陣列A[n] 輸出描述: 滿足條件的最大乘積 輸入例子1: 3 4 1 2 輸出例子1: 24 思路: 由於空間複雜
python實現從字串中找出特定字元的位置以及個數的方法
python實現從字串中找出特定字元的位置以及個數的方法 本文例項主要實現給出任意字串,獲取字串中某字元的位置以及出現的總次數。 實現該功能程式碼的時候可以使用函式enumerate來將字串分離成位置和字元,然後進行比較即可。 具體實現程式碼如下: #!/b
陣列中有三個數只出現一次,其它的數恰好出現兩次,找出這三個數。
具體的題意如題 當我第一次碰到這類題的時候是宿舍的舍友分享的,當時他說的問題還要簡單一些,具體的題意是"陣列中只有一個數只出現一次,其它的數恰好出現兩次,找出這個數。" 當時我的第一感覺就是要用到快排,因此得出第一種演算法,將陣列進行快排的第一層排序,然後從中間分開,數字
從陣列中找出只出現一次的兩個數,陣列中其他數都出現兩次
題目:在陣列中有兩個數只出現一次,其他數均出現兩次。問怎樣快速找出這兩個數。 方法一: 直接遍歷整個陣列,建成類似hash的陣列。用原始陣列中元素值當hash陣列下標,出現次數當hash陣列元素值。最後再遍歷一次hash,找出值為1元素的下標。或者不用hash陣列,用ma
從鍵盤上輸入三個數,編寫一個max函式,可以輸出三個數中最大的數字
int max(int a,int b,int c ); int main(int argc, const char * argv[]) { int a,b,c; scanf("%d",&a); scanf("%d",&b);
從陣列中找出最大的兩個數
題目:從陣列區間A[lo, hi]中找出最大的兩個整數A[x1]和A[x2],要求元素比較的次數,要求儘可能的少 迭代版1: 如圖所示,當整個掃描一遍陣列A,找出最大的數x1後,再掃描一次陣
【LeetCode】數組-2(628)-數組中三個數相乘最大
負數 [] product leet ont 沒有 程序 時間復雜度 array 題目不難: 思路一(排序取兩端) 先排序,最後三個數相乘即可。(很快就想到了,但是沒想全面 [??] ) 缺陷:沒有考慮到有負數的情況,當至少有兩個負數時,需要判斷 最大數乘兩個最小的負數 和
從陣列中取n個數有多少種組合
private void mergeSort() { // int[] aa = {3, 5, 7, 9, 8, 4, 6, 1, 2}; // merge(aa, 0, aa.length-1); // for (int i=0;i<aa.
查詢斐波納契數列中第 N 個數
題目 查詢斐波納契數列中第 N 個數。 所謂的斐波納契數列是指: 前2個數是 0 和 1 。 第 i 個數是第 i-1 個數和第i-2 個數的和。 斐波納契數列的前10個數字是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 … 解法 pub
Problem G. Green Day(從圖中找k棵結構相同的樹)
題意: 有一個多邊形,你從中分出k棵結構完全相同的樹,每兩棵樹之間不會有重邊,輸出這個多邊形的邊數,及每棵樹的所有邊 解析: 很水的題想不到卻很難。計算一下就知道這個多邊形應該是2k邊。如果一個正2k邊形畫成完全圖,有一個結論:除了對立頂點所連的邊以外,其他邊
隨筆-陣列中三個數的最大乘積
題目: 給定一個整型陣列,在陣列中找出由三個陣列成的最大乘積,並輸出這個乘積。 示例 1: 輸入: [1,2,3] 輸出: 6 示例 2: 輸入: [1,2,3,4] 輸出: 24 注意: 給定的整型陣列長度範圍是[3,104],陣列中所有的元素範圍是[-1000,
【Yaser S. Abu-Mostafa課件】從資料中學習——三個學習原則
本課件主要內容包括: 重複的主題:簡單假設 “奧卡姆剃刀”原則 第一個問題:“簡單”意味著什麼? 第二個問題:為什麼越簡單越好? 偏差 分佈函式匹配 重用資料集 兩種補救方法 完整課件