算法题:两数之和 简单

准备用java开始刷算法了…但有点暗了,但没事,俗话说:"一棵树种植的最好时机是二十年前,其次是现在 "。

两数之和

自己的解法:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] b= new int[2];
        int a = nums.length;
        for(int i=0;i<a-1;i++){
            for(int j=i+1;j<a;j++){
                if(nums[i]+nums[j]==target){
                    b[0]=i;
                    b[1]=j;
                }
            }

        }
        return b;
    }
}

优解

这些算法不看不知道,一看真的吓一跳,真的太棒了

class Solution {
public int[] twoSum(int[] nums, int target) {
    if(nums == null || nums.length < 2) {
        return new int[] {};
    }
    Map<Integer, Integer> map = new HashMap<>();
    int left = 0;
    int right = nums.length - 1;
    while(left <= right) {
        int ln0 = nums[left];
        int rn0 = nums[right];
        int ln1 = target - ln0;
        int rn1 = target - rn0;
        if(map.containsKey(ln1)) {
            return new int[] {left, map.get(ln1)};
        }
        else {
            map.put(ln0, left++);
        }
        if(map.containsKey(rn1)) {
            return new int[] {right, map.get(rn1)};
        }
        else {
            map.put(rn0, right--);
        }
    }
    return new int[] {};
}

}

这个算法利用了map,然后指定了左右的两个指针,两边同时开工,ln0为左边的第一个数,rn0为右边的第一个数, ln1和rn1是分别要取map中找的数据,如果map中包含了ln1和rn1的其中一个就直接可以返回结果了,如果没找到则左边的往左进一步则加1,右边的指针往右边走一步,则减1,至到left<=right结束。

总结

经过这道题,我觉得用map好爽呀,但我现在的固定思维就完全没有考虑过map,在以后的题中,我一定会把map这个思想加入到我的脑海中,还有两个左右指针同时开工,这也是非常好的思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值