日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[劍指offer]面試題第[57]題[Leetcode][第167題][第1題]
有序無序之分 題目輸出不同之分 以下解法按照[劍指offer]面試題第[57]題進行題解

【問題描述】[簡單]

輸入一個遞增排序的數組和一個數字s,在數組中查找兩個數,使得它們的和正好是s。如果有多對數字的和等于s,則輸出任意一對即可。示例 1:輸入:nums = [2,7,11,15], target = 9 輸出:[2,7] 或者 [7,2] 示例 2:輸入:nums = [10,26,30,31,47,60], target = 40 輸出:[10,30] 或者 [30,10]

【解答思路】

1. HashSet(有序無序均可)


時間復雜度:O(N) 空間復雜度:O(N)

public int[] twoSum(int[] nums, int target) {HashSet<Integer> set = new HashSet<>();for(int num:nums){set.add(num);}for(int num:nums){if(set.contains(target-num)){int[] res = new int[2];res[0] = num;res[1] =target -num;return res;}}return new int[0];}

優化

public int[] twoSum(int[] nums, int target) {Set<Integer> set = new HashSet<>();for (int num : nums) {if (!set.contains(target - num))set.add(num);else return new int[]{num, target - num};}return new int[]{};}
2. 二分+雙指針(有序)


時間復雜度:O(N) 空間復雜度:O(1)

public int[] twoSum(int[] nums, int target) {int i = 0, j = nums.length - 1;while(i < j) {int s = nums[i] + nums[j];if(s < target) i++;else if(s > target) j--;else return new int[] { nums[i], nums[j] };}return new int[0];}
3. 二分查找(有序)

在數組中找到兩個數,使得它們的和等于目標值,可以首先固定第一個數,然后尋找第二個數,第二個數等于目標值減去第一個數的差。利用數組的有序性質,可以通過二分查找的方法尋找第二個數。為了避免重復尋找,在尋找第二個數時,只在第一個數的右側尋找。

時間復雜度:O(NlogN) 空間復雜度:O(1)

public int[] twoSum(int[] numbers, int target) {for (int i = 0; i < numbers.length; ++i) {//為了避免重復尋找,在尋找第二個數時,只在第一個數的右側尋找。int low = i + 1, high = numbers.length - 1;while (low <= high) {int mid = (high - low) / 2 + low;if (numbers[mid] == target - numbers[i]) {return new int[]{numbers[mid], target - numbers[i]};} else if (numbers[mid] > target - numbers[i]) {high = mid - 1;} else {low = mid + 1;}}}return new int[]{-1, -1};}
4. 暴力(不建議)

時間復雜度:O(N^2) 空間復雜度:O(1)

public 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[] { nums[j], nums[i] };}}}return new int[] { -1, -1 };}

【總結】

1. 有序數組 二分法
2.HashSet 邊添加邊尋找 成對的第一個數添加入集合 成對的另一個數會檢查入集合時返回正確的一對數
3.細節

返回數組
return new int[] { nums[i], nums[j] };
返回空數組
return new int[0];
return new int[]{};

3.面試 問清楚需求條件 暴力<HashSet<二分法<雙指針

總結

以上是生活随笔為你收集整理的[剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。