1、地址
https://leetcode-cn.com/problems/two-sum/
2、题面分析
题目
题目信息
- 1、如果多重解出现,返回一个就行
- 2、每个数组中的整数,最多被使用一次。【返回的下表,必须是不同的】
-
3、暴力求解法—O(
)
求解思路
顺序选取
依次枚举出所有组合,当某种组合对应的两数之和等于target返回解 设定两个指针i,j永远可以假设 i < j
- 初始化时,则需要使 j = i + 1
代码实现
class Solution {public int[] twoSum(int[] nums, int target) {int[] ret = new int[2];int len = nums.length;for(int i = 0 ; i < len - 1; i++){for(int j = i + 1 ; j < len; j++ ){if(nums[i] + nums[j] == target){ret[0] = i;ret[1] = j;return ret;}}}return ret;}}
总结
如果求解的问题是输入的一个子集,那么可以尝试暴力枚举
4、二分查找
求解思路
找到一个时间复杂度小于 O() 的算法
- 暴力破解的内循环,变成二分查找
代码实现
class Solution {public int[] twoSum(int[] nums, int target) {int[] ret = new int[2];int len = nums.length;int[] sortedNums = nums.clone();Arrays.sort(sortedNums);for(int i = 0 ; i < len ; i++){int cur = sortedNums[i];int findTarget = target - cur;int index = binarySearchInSortedArray(sortedNums, findTarget, i + 1);if(index != -1){return remapping(nums, sortedNums[i], sortedNums[index]);}}return ret;}public int[] remapping(int[] nums, int t1, int t2){int i = -1, j = -1;for(int index = 0; index < nums.length; index ++ ){if(i == -1 && t1 == nums[index]){i = index;}if(t2 == nums[index]){j = index;}if(i != -1 && j != -1 && i != j){break;}}return new int[] {i, j};}public int binarySearchInSortedArray(int[] sortedNums, int target, int startIndex){int leftIndex = startIndex;int rightIndex = sortedNums.length - 1;while(leftIndex <= rightIndex){int midIndex = leftIndex + (rightIndex - leftIndex) / 2;int mid = sortedNums[midIndex];if(target == mid){return midIndex;}if(target < mid){rightIndex = midIndex - 1;}else{leftIndex = midIndex + 1;}}return -1;}}
5、Hash表求解
求解思路
代码实现
class Solution {public int[] twoSum(int[] nums, int target) {int len = nums.length;Map<Integer, Integer> map = new HashMap<>();for(int i = 0; i < len; i ++){int cur = nums[i];int findTarget = target - cur;Integer j = map.get(target - cur);if(j != null){return new int[]{i, j};}map.put(cur, i);}return new int[2];}}
