1. 两数之和

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

**进阶:**你可以想出一个时间复杂度小于 O(n2) 的算法吗?

class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 1.要先将nums进行一次的备份。
        int[] temps = nums.clone();
        // 2.给nums进行排序,这样子才可以根据大小进行伸缩判断。
        int temp;
        for(int low = 0; low < nums.length; ++low){
            boolean flag = true;
            for(int high = nums.length - 1; high > low; --high){
                if(nums[high - 1] > nums[high]){
                    temp = nums[high];
                    nums[high] = nums[high - 1];
                    nums[high - 1] = temp;
                    flag = false;
                }
            }
            if(flag){
                break;
            }
        }
        // 2. 取出头和尾作为我们的测试值。头是i,从0开始。尾巴是j,从最后一个数字开始。
        int[] returns = new int[2];
        for(int low = 0, high = nums.length - 1; low < high;){
            int myTarget = nums[low] + nums[high];
            // 如果测试结果大于最终的内容,那么我们就将尾巴-1.
            if(myTarget > target){
                --high;
                continue;
            }
            // 如果测试结果小于最终的结果,那么我们就将头+1.
            if(myTarget < target){
                ++low;
                continue;
            }
            // 如果发现结果是我们要的,就对原来的备份数组进行遍历,寻找我们要的最终结果。
            if(myTarget == target){
                for(int m = 0; m < temps.length; ++m){
                    if(nums[low] == temps[m]){
                        returns[0] = m;
                        break;
                    }
                }
                for(int m = 0; m < temps.length; ++m){
                    if(nums[high] == temps[m] && returns[0] != m){
                        returns[1] = m;
                        break;
                    }
                }
                break;
            }
        }
        System.out.println("[" + returns[0] + "," + returns[1] + "]");
        return returns;
    }
}
上一篇:洛谷P1020,导弹拦截(LIS)


下一篇:2021-10-04