1. 程式人生 > >3Sum Closest從數列中找到三個數之和最接近給定值

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課件】資料學習——個學習原則

本課件主要內容包括: 重複的主題:簡單假設 “奧卡姆剃刀”原則 第一個問題:“簡單”意味著什麼? 第二個問題:為什麼越簡單越好? 偏差 分佈函式匹配 重用資料集 兩種補救方法 完整課件