【算法学习】【数组】两数之和等于K

在给定递增数组内,找到和为K的两个数字的下标,假设有且仅有唯一的一对数字,同一个数字仅使用一次。

作为一个刚开始研究算法的小白,说实话 ,我第一反应就是遍历然后依次匹配比较 ^_^

其实针对于数组这个类型的题目 ,都可以套用【双端指针】这个思路。

有这么几个关键词可以拿来做文章

  1. 和为K ,则两个【索引】映射的数组元素之和为K,本质是两个端点的索引。
  2. 递增数组,在和为K的前提下。会出现两种情况

        1)和小于K,我们可以将较小的数变大,即头指针向右移动

        2)和大于K,我们可以将较大的数变小,即尾指针向左移动

        

根据以上分析,代码如下,时间复杂度O(N)

​

public class Sum {

    public static void main(String[] args) {
        int k = 3;
        int[] num = {1,2,4,6,10};
        int[] result = index(num, k);
        for (int value : result) {
            System.out.println(value);
        }
    }

    public static int[] index(int[] array,int target){
        int idxStart = 0;
        int idxEnd = array.length-1;
        while (idxStart < idxEnd && array[idxStart]+array[idxEnd]!=target){
            if(array[idxStart]+array[idxEnd]<target){
                idxStart = idxStart+1;
            }else {
                idxEnd = idxEnd -1 ;
            }
        }
        return new int []{idxStart,idxEnd};
    }
}


​


现在时间是2022年1月6日 ,上文提到思路有问题,缺陷在于双指针来控制和的大小方案只适用于正整数,对于负整数来说,效果恰恰是相反的  ̄□ ̄|| 这很尴尬呀,所以在这里更新一下算法,使用了哈希的思路

   public static int[] index(int[] array,int target){
  
        //key:value in array;value:index in array
        Map<Integer,Integer> map = new HashMap<>(array.length);
        for (int i = 0; i < array.length; i++) {
            //计算预期差值
            int perfect = target - array[i];
            if (map.containsKey(perfect)){
                return new int []{map.get(perfect),i};
            }else {
                map.put(array[i],i);
            }
        }
        return null;
    }

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值