LeetCode刷题-两数之和(持续更新)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode刷题-两数之和(持续更新)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- LeetCode 1. Two Sum (兩數之和)
- 題目描述
- 樣例
- 解題思路一(暴力法)
- 解題思路二(使用map)
前言:最近業余時間,一直在看LeetCode上面的題,上面有許多好的解題思路可以借鑒到我們真正的項目中。總之,要靜下心來認真研究,對我們無論是目前做的項目還是以后出去面試,都會有很大的幫助。
LeetCode 1. Two Sum (兩數之和)
題目描述
給定一個整型數組,要求返回兩個數的下標,使得兩數之和等于給定的目標值,要求同一個下標不能使用兩次。
數據保證有且僅有一組解。
樣例
給定數組 nums = [2, 7, 11, 15],以及目標值 target = 9,
由于 nums[0] + nums[1] = 2 + 7 = 9,
所以 return [0, 1].
解題思路一(暴力法)
這個我們大家只要寫過一兩年代碼都會想到,就是兩遍for循環就可以搞定。
核心代碼如下:
//暴力方法public static int[] twosum(int[] nums,int target) {for (int i = 0;i<nums.length;i++) {for (int j = i+1;j < nums.length;j++) {if (nums[j] == target - nums[i]) {return new int[] {j,i};}}}throw new IllegalArgumentException("No two sum solution");}結果分析:
暴力枚舉方法很簡單:兩重循環枚舉下標 i,j,然后判斷nums[i]+nums[j]nums[i]+nums[j] 是否等于 targettarget。時間復雜度:由于有兩重循環,所以復雜度是 O(n2)。
解題思路二(使用map)
- 遍歷數組 nums,i 為當前下標,每個值都判斷map中是否存在 target-nums[i] 的 key 值
- 如果存在則找到了兩個值,如果不存在則將當前的 (nums[i],i) 存入 map 中,繼續遍歷直到找到為止
- 如果最終都沒有結果則拋出異常
核心代碼如下:
//哈希表public static int[] twosumMap(int[] nums,int target) {Map<Integer,Integer> map = new HashMap<>();for (int i = 0;i < nums.length;i++) {if (map.containsKey(target - nums[i])) {return new int[] {map.get(target-nums[i]),i};}map.put(nums[i],i);}throw new IllegalArgumentException("No two sum solution");}使用map時候可能大家會有疑問,如果遇到{2,2}這樣數據會出現問題,這一點我們做個小實驗就可以看出是否有問題。
public static void main(String[] args) {int[] nums = { 7,2,4, 11,2, 15};int[] twosum = twosumMap(nums, 4);System.out.println(Arrays.toString(twosum));}結果為:[1, 4]
通過以上結果看出,如果出現重復的數據不會出現問題。
個人公眾號:
微信粉絲群
總結
以上是生活随笔為你收集整理的LeetCode刷题-两数之和(持续更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详解MySQL字符串函数重复REPEAT
- 下一篇: 在技术团队中发展的7个关键技能