LeetCode第一題:兩數之和
阿新 • • 發佈:2020-12-24
LeetCode第一題:兩數之和
題目描述:
給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
示例
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/two-sum
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
思路1 map集合:
(ps.不懂map集合的小夥伴不要慌,往下看有一個普通陣列解決方案)
- 本題尋找一個給定陣列 nums 裡兩個元素相加和為 target (加數不能為同一個元素)
- 加數+加數=和 <==> 和 - 加數=補數 (補數相當於另一個加數)
- 我們可以利用 map 集合 key-value 的優勢來建立一個 補數-下標 的map集合
- map.containsKey(nums[i]):查詢是否有key值為** nums[i] **的map元素
- map.get(nums[i]):根據key值獲取對應的value
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result=new int[2];
//建立map集合,key值為:nums(value)的補數,(target-nums[i])
//將nums陣列每個元素的補數與其自身以k-v的形式存入map中,並每次求得時看一下有沒有恰好補數等於其
//nums[i]的,如果有,那就算是找到答案了
HashMap<Integer,Integer> map=new HashMap<Integer,Integer> ();
for(int i=0 ; i<nums.length ; i++){
//看map之前是否有補數(key)為當前nums[i]的元素沒
if(map.containsKey(nums[i])){
//有,那這兩個數就可以組成答案了
result[0]=map.get(nums[i]);
result[1]=i;
//注意:題意要求答案下標順著來,於是先把之前那個數的下標存入[0]中,再存當前數下標
return result;
}
//沒有,就將補數存入key,i下標存入value,繼續迴圈
map.put(target-nums[i],i);
}
return result;
}
}
思路2 暴力破解:
雙重迴圈,暴力破解
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result=new int[2];
for(int i=0 ; i<nums.length-1 ; i++){
for(int j=i+1 ; j<nums.length ; j++){
if(nums[i]+nums[j]==target){
result[0]=i;
result[1]=j;
return result;
}
}
}
return result;
}
}