1. 程式人生 > 其它 >LeetCode第一題:兩數之和

LeetCode第一題:兩數之和

技術標籤:java題庫javamapleetcode

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;
    }
}