15. 3Sum,16. 3Sum Closest,18. 4Sum(最後一個方法重要)重要
第一題、15. 3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
二分查詢的思想
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > ret;
int size = num.size();
sort(num.begin(), num.end());
for(int i = 0; i < size; i ++)
{
//skip same i
while(i > 0 && i < size && num[i] == num[i-1 ])
i ++;
int j = i + 1;
int k = size - 1;
while(j < k)
{
int sum = num[i] + num[j] + num[k];
if(sum == 0)
{
vector<int> cur(3);
cur[0] = num[i];
cur[1 ] = num[j];
cur[2] = num[k];
ret.push_back(cur);
j ++;
k --;
//skip same j
while(j < k && num[j] == num[j-1])
j ++;
//skip same k
while(k > j && num[k] == num[k+1])
k --;
}
else if(sum < 0)
{
j ++;
}
else
{
k --;
}
}
}
return ret;
}
第二題:16. 3Sum Closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
int threeSumClosest(vector<int>& nums, int target) {
vector<vector<int> > ret;
int size = nums.size();
sort(nums.begin(), nums.end());
int sum = nums[0]+nums[1]+nums[size-1];
int minDis = sum - target;
for(int i = 0; i < size; i++)
{
int j = i + 1;
int k = size -1;
while(j<k)
{
sum = nums[i]+nums[j]+nums[k];
if(abs(sum - target) < abs(minDis))
{
minDis = sum - target;
}
//minDis = sum - target;
if(sum == target)//增加這部分處理,是對於{1,2,3,4,5,6,7} target=10,這種一旦找到1,2,7三個數,則不用繼續遍歷,繼續
{
return target;
}
else if(sum > target)
{
k--;
}
else
{
j++;
}
}
}
return minDis + target;
}
第三題、18. 4Sum
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note: The solution set must not contain duplicate quadruplets.
For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
/*
對陣列排序
確定四元數中的前兩個(a,b)
遍歷剩餘陣列確定兩外兩個(c,d),確定cd時思路跟3Sum確定後兩個資料一樣,二分查詢左右逼近。
在去重時採用set集合
*/
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> result;
set<vector<int>> setRes;
int len = nums.size();
sort(nums.begin(),nums.end());
if(len < 4)
{
return (vector<vector<int>> ());
}
/*
for(int i = 0; i < len; i++)
{
for(int j = i + 1; j < len; j++)
*/
for(int i = 0; i < len - 3; i++)
{
for(int j = i + 1; j < len - 2; j++)
{
//二分查詢
int begin = j + 1;
int end = len -1;
while(begin < end)
{
int sum = nums[i] + nums[j] + nums[begin] + nums[end];
if(sum == target)
{
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[begin]);
temp.push_back(nums[end]);
setRes.insert(temp);
begin++;
end--;
}
else if(sum > target)
{
end--;
}
else
{
begin++;
}
}
}
}
set<vector<int>>::iterator iter;
for(iter = setRes.begin(); iter!=setRes.end(); iter++)
{
result.push_back(*iter);
}
return result;
}
時間複雜度更低的程式碼:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> total;
int n = nums.size();
if(n<4) return total;
sort(nums.begin(),nums.end());
for(int i=0;i<n-3;i++)
{
if(i>0&&nums[i]==nums[i-1]) continue;
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
if(nums[i]+nums[n-3]+nums[n-2]+nums[n-1]<target) continue;
for(int j=i+1;j<n-2;j++)
{
if(j>i+1&&nums[j]==nums[j-1]) continue;
if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target) break;
if(nums[i]+nums[j]+nums[n-2]+nums[n-1]<target) continue;
int left=j+1,right=n-1;
while(left<right){
int sum=nums[left]+nums[right]+nums[i]+nums[j];
if(sum<target) left++;
else if(sum>target) right--;
else{
total.push_back(vector<int>{nums[i],nums[j],nums[left],nums[right]});
do{left++;}while(nums[left]==nums[left-1]&&left<right);
do{right--;}while(nums[right]==nums[right+1]&&left<right);
}
}
}
}
return total;
}
相關推薦
15. 3Sum,16. 3Sum Closest,18. 4Sum(最後一個方法重要)重要
第一題、15. 3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in
float轉16進位制, 16進位制轉float(java )
直接上程式碼,有需求的朋也可以檢視下: package com.sondon.dev_soceket.test; /** * @Project : 硬體通訊 * @Package : com
AndroidManifest.xml裏加入不同package的component (Activity、Service裏android:name裏指定的值一般為句號加類名),可以通過指定完全類名(包名+類名)來解決
代碼 gui 目的 tools 註冊 不同 res 收藏 small 我們都知道對於多個Activity如果在同一個包中,在Mainfest中可以這樣註冊 Xml代碼 <span style="font-size: small;"><?xml
eclipse批量替換,修改變量名或單詞(兩種方法)
.com 雙擊 方框 批量 ref lac cnblogs height ima 第一種(常用): ①如圖:雙擊選中變量名id,右鍵選擇Refactor中的Rename ②之後如下圖所示,紅箭頭的帶有方框的就是選中修改的變量名,此時修改提示框的內容,後面帶方框的也
寫不了,不會,告辭。程序員三連(第二次站立議會)
昨天 nbsp 會議 安卓 暫時 ima view 構建 困難 目前的進度: 個人進度: 劉子琦:已經熟悉安卓開發軟件的使用,計劃最近一個站立議會完成2個頁面開發,問題目前對Android結構理解較淺 陳藝祥:初步學習了sql server,學會了建表等基本操作,計劃
縱裏尋她千百度,暮然回首,那人卻在燈火闌珊處(微信三方登陸)
判斷 esp sage 邏輯判斷 平臺 hat 小技巧 開放平臺 註意 小插曲就是app做微信三方登陸是很久之前,後面又添加了PC的微信三方登陸,而文檔上說unionid是同一個賬號下不同應用統一的,但是app拿的是uid,導致pc拿的unionid始終對不上,導致浪費了一
零基礎自學人工智能,看這些資料就夠了(300G資料免費送)
工具 flow 領取 學習 講解 及其 需要 量化 決策 為什麽有今天這篇?首先,標題不要太相信,哈哈哈。 本公眾號之前已經就人工智能學習的路徑、學習方法、經典學習視頻等做過完整說明。但是鑒於每個人的基礎不同,可能需要額外的學習資料進行輔助。特此,向大家免費發送近300G的
人工智能時代,人類會被秒殺?(楚才國科)
即將 超過 ron 收益 效率 高效 同仁 機器 webp 人工智能像一把利刃,將時代劈斬為涇渭分明的兩個板塊:在人工智能到來之前,世界上的一切循規蹈矩,有序進行;人工智能到來之後,未來勢必是一個大變革的時代,所有的秩序和契約都會被重新撰寫。 自從深度學習發明以來,越來越
從一個控制器返回後,控制器所屬的tabbarController沒選中(tabbarItem圖示不亮)
最近在使用UITabbarController遇到一個問題,就是所屬tabbarController的一個控制器,在使用popViewControllerAnimated方法回到tabbarController時,控制器所屬的tabbarItem沒有顯示選中。可以在AppDelegate.m中的
關於比較器,我們知道我們java陣列中可以使用一個方法:Array.sort(array);來進行排序
關於比較器,我們知道我們java陣列中可以使用一個方法:Array.sort(array);來進行排序,如果我們陣列中是放的基本資料型別,就可以直接比較大小排序,如果我們放的是物件的話,這樣排序就意義不大,需要我們自己進行相應的修改,得到我們想要的比較結果。 比如我們有三個學生,學生屬性有id,
Java前端Rsa公鑰加密,後端Rsa私鑰解密(支援字元和中文)
Java前端Rsa公鑰加密,後端Rsa私鑰解密(支援字元和中文) package com.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import j
十大經典排序演算法動畫與解析,看我就夠了!(配程式碼完全版)
GitHub Repo:Sort Article Follow: MisterBooo · GitHub 排序演算法是《資料結構與演算法》中最基本的演算法之一。 排序演算法可以分為內部排序和外部排序。 內部排序是資料記錄在記憶體中進行排序。 而外部排序是因排序的資料很大,一次不能容納全部的排
後端不來過夜半,閒敲mock落燈花(mockjs+Vuex+Vue實戰)
Mock的由來【誤】 黃梅時節家家雨,青草池塘處處蛙。 後端不來過夜半,閒敲mock落燈花 趙師秀:南宋時期的一位前端工程師 詩詞背景:在一個梅雨紛紛的夜晚,正處於專案編碼階段,書童卻帶來訊息:“寫後端的李秀才在幾個時辰前就趕往臨安度假去
我有500w個單詞,你幫忙設計一個數據結構來進行儲存,存好之後,我有兩個需求。(程式人生程式碼copy)
1、來了一個新的單詞,需要判斷是否在這500w個單詞中 2、來了一個單詞字首,給出500w個單詞中有多少個單詞是該字首 package cango.scf.common.util; import java.util.HashMap; import java.util.
【C++】提醒使用者輸入數字,如何處理使用者錯誤輸入?(優秀的程式設計思想)
你提醒使用者一定要輸入5個數字 但是使用者故意輸入2個數字,一個其他字元,再輸入其他數字, 你該怎麼處理這樣的普遍情況? 解決辦法: 用到cin的bool特性! #include <iostream> const int Max = 5; int main() { us
程式基本演算法習題解析 如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等於另一個數,則稱這兩個數為互滿數。求出3000以內所有的互滿數並輸出。
題目: 如果有兩個數,每一個數的所有約數(除它本身以外)的和正好等於另一個數,則稱這兩個數為互滿數。求出3000以內所有的互滿數並輸出。 先附上程式碼: // Chapter1_8.cpp : Defines the entry p
收官蓉城,展望2019多媒體技術新方向(內附資料下載)
伴隨著2018年音視訊技術生態的風起雲湧,LiveVideoStack多媒體開發技術沙龍收官蓉城,在對過去一年技術梳理的同時,各位大咖也對明年發展趨勢做了展望:5G時代即將來臨,蘋果、高通從“芯”開戰,音視訊技術又將有怎樣變化?在H.265、AVS2、AV1爭鬥正酣時,AV2、H.266將在
tomcat中部署好的專案,內網和localhost可以訪問,但是外網不能訪問(Windows 2008 R2中)
在Windows 2008 R2用tomcat搭建環境能夠執行web專案,在本地用localhost或者內網可以訪問網站,但是外網均無法訪問網站,發現有三種可能性致使這種情況發生: 第一種情況:防火牆
不止20k,Python薪酬又飆升了?(內附轉型指南)
Python 誕生之初就被譽為最容易上手的程式語言。進入火熱的 AI 人工智慧時代後,它也逐漸取代 Java,成為程式設計界的頭牌語言。更有碼農圈金句:「學完 Python,可以上天」佐證其火熱程
Python+OGR庫學習(一):讀取點向量檔案屬性值和座標,並儲存為TXT(一行一個要素值)
程式碼思路: 1、匯入相關庫包,切換到當前資料夾 2、註冊驅動,開啟點向量檔案,獲取圖層 3、開啟待寫入TXT檔案 4、遍歷要素: (1)獲取當前要素‘ID’和‘cover’欄位屬性 (2)獲取當前點要素對應幾何物件和其座標值X,Y (3)將ID、cover、X、Y寫入TXT檔案 (