每日题解:LeetCode 167. 两数之和 II - 输入有序数组

题目地址

题目描述

解法

CPP

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
       int low = 0, high = numbers.size() - 1;
        while (low < high) {
            int sum = numbers[low] + numbers[high];
            if (sum == target) {
                return {low + 1, high + 1};
            }
            if (sum < target) {
                ++low;
            }else{
                --high;
            }
        }
        return {-1, -1};
    }
}

JAVA

class Solution {
    public int[] twoSum(int[] numbers, int target) {
       Map<Integer,Integer> numMap=new HashMap();
            for(int i=0;i< numbers.length;i++){
             int difference=target-numbers[i];
             if(numMap.containsKey(difference)){
               return new int[]{numMap.get(difference)+1,i+1};
             }
             numMap.put(numbers[i],i);
         }
            return null;
    }
}

解题思路

hash表

思路与两数之和的解法一样,利hash表判断,目标值target与当前numbers[i]的差值,是否存在于hash表中,然后返两者的坐标值,这里稍微特殊处理一下,坐标值+1

   Map<Integer,Integer> numMap=new HashMap();
            for(int i=0;i< numbers.length;i++){
             int difference=target-numbers[i];
             if(numMap.containsKey(difference)){
               return new int[]{numMap.get(difference)+1,i+1};
             }
             numMap.put(numbers[i],i);
         }

双指针

由于题目已经说了数组为有序的,这样可以使用双指针解决,如果两个指针的和sum小于target,说明右边的值比较小,那就左指针往右移动,反之,说明右边值比较大
在这里插入图片描述
如图,双指针的和往右边是越来越大

 int low = 0, high = numbers.size() - 1;
        while (low < high) {
            int sum = numbers[low] + numbers[high];
            if (sum == target) {
                return {low + 1, high + 1};
            }
            if (sum < target) {
                ++low;
            }else{
                --high;
            }
        }
最近的文章

每日题解:LeetCode 454. 四数相加 II

题目地址个人博客地址题目描述给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有…

继续阅读
更早的文章

每日题解:LeetCode 35. 搜索插入位置

题目地址题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例1:输入:[1,3,5,6],5输出:2示例2:输入:[1,3,5,6],2输出:1示例3:输入:[1,3,5,6],7输出:4示例…

继续阅读