近幾天做了幾道求和相關的題,用的方法基本都一樣,所以放到一起寫。包括
1、兩數之和(leetcode第1題)
2、三數之和(leetcode第15題)
3、最接近的三數之和(leetcode第16題)
4、四數之和(leetcode第18題)
題目描述
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,
並返回他們的陣列下標。
你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
雜湊表
簡單介紹一下雜湊表,首先需要知道什麼是雜湊函式。關鍵值根據某種對映關係計算出他儲存的位置位址,這種對映關係就稱之為雜湊函式,即儲存位址 = f (關鍵值)。f即為雜湊函式。採用這種方式將關鍵值儲存在一塊空間中,這塊空間成為雜湊表,雜湊表最適合求解的問題是查詢與給定值相等的值的位置。簡化了比較過程,所以效率大大提高。
**塊
class solution ;
}hashtable.put(nums[i], i);
}return new int[0];
}}
**解釋
1、建立乙個空的雜湊表;
2、遍歷列表,觀察是否存在 target-nums[i] 的值,沒有的話,將(nums[i], i)放入雜湊表中;
3、存在的話,直接返回target-nums[i]的索引以及i的值;
出錯1、for迴圈沒有寫資料型別
2、建立返回的新陣列時沒有new
題目描述
給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[ [-1, 0, 1],
[-1, -1, 2]
]
**塊public list> threesum(int nums)
}return ans;
}
**解釋
1、建立乙個空列表用來返回最後結果
2、將陣列排序
3、遍歷陣列,如果第乙個數就大於target,則直接跳出迴圈,返回空列表
4、去重,如果nums[i]==nums[i-1],則直接遍歷下乙個元素
5、定義雙指標,分別指向遍歷到的元素的下乙個元素,以及整個陣列的最後乙個元素
6、當左指標小於右指標時,迴圈
7、定義sum等於三數之和,如果sum>target,則右指標往左移,如果sum出錯
1、arrays.sort(nums); 排序關鍵字搞錯
2、 if(i>0 && nums[i] == nums[i-1]) continue; 忽略了i>0;
3、ans.add(arrays.aslist(nums[i],nums[l],nums[r])); 沒有將陣列轉化為列表;
題目描述
給定乙個包括 n 個整數的陣列 nums 和 乙個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
輸入:nums = [-1,2,1,-4], target = 1
輸出:2
解釋:與 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
思路
思路基本與上一題一樣,只不過多了乙個判斷三數之和與target的差什麼時候最小
**塊
public int threesumclosest(int nums, int target)
int j = i+1,k = n-1;
while(jtarget)
arrays.sort(nums);
for(int i1 = 0;i10 && nums[i1]==nums[i1-1])
int max = nums[i1]+nums[n-3]+nums[n-2]+nums[n-1];
if(maxtarget)
for(int i2 = i1 + 1;i2i1+1 && nums[i2]==nums[i2-1])
int maxx = nums[i1]+nums[i2]+nums[n-2]+nums[n-1];
if(maxxtarget)
int i3 = i2+1;
int i4 = n-1;
while(i3target)else}}
}return result;
}
**解釋
思路仍然是一樣的,不再贅述,不過是多了乙個for迴圈。
總結:希望以後再遇到求和與目標值作比較問題的問題能夠首先想到雙指標。
leetCode n數之和 雜湊表 雙指標
示例 給定 nums 2 7,11 15 target 9因為 nums 0 nums 1 2 7 9所以返回 0,1 思路 設定乙個雜湊表map,記錄每個值對應的索引i,通過判斷target nums i 的值是否存在來確定另乙個值的位置。兩數之和 vartwosum function nums,...
15 三數之和(雙指標或雜湊表)
題目要求我們得到所有三數之和為0的不重複三元組。如果僅是三數之和為0,可以簡單的使用三重迴圈列舉出所有三元組,並找出和為0的即可。但是施加不重複這個條件之後,就不能簡單的列舉所有三元組,1,0,1 和 0,1,1 這樣的情況是不允許出現在答案裡的。首先要解決的一點是如何保證不重複。重複的本質是陣列元...
Day 11 找硬幣(雙指標 雜湊表)
acwing 1532.找硬幣 伊娃喜歡從整個宇宙中收集硬幣。有一天,她去了一家宇宙購物中心購物,結賬時可以使用各種硬幣付款。但是,有乙個特殊的付款要求 每張帳單,她只能使用恰好兩個硬幣來準確的支付消費金額。給定她擁有的所有硬幣的面額,請你幫她確定對於給定的金額,她是否可以找到兩個硬幣來支付。輸入格...