[剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]
生活随笔
收集整理的這篇文章主要介紹了
[剑指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)
優(yōu)化
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)
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.細節(jié)
返回數組
return new int[] { nums[i], nums[j] };
返回空數組
return new int[0];
return new int[]{};
3.面試 問清楚需求條件 暴力<HashSet<二分法<雙指針
總結
以上是生活随笔為你收集整理的[剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab假设网格颜色,MATLAB
- 下一篇: 几种字符串加密解密的方法