Leet code 第一题 两数之和 JAVA python

一开始用了两个For 循环写的,看了官方的解决方案发现复杂度太高,时间复杂度为O(N2)。

然后发现用Hashmap更加简单一点:

JAVA:
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map=new HashMap<>();
        for (int i=0;i<nums.length;i++){
            int complement= target-nums[i];
            if(map.containsKey(complement)){
                return new int[] {map.get(complement),i};
            }
            map.put(nums[i], i);
        }
      throw new IllegalArgumentException("No two sum solution");
    }
}
先是求target减去第i个数字还需要多少,然后如果它在map里就返回它和i的下标
如果不存在,就把它和下标存进map。
例:
【2,9,11,15】target=13
i=0; nums[i]=2; complement=13-2=11;不在;把2,0存进map
i=1;nums[i]=9;complement=13-9=4;map:2 不在;把9,1存进map
i=2;nums[i]=11;complement=13-11=2;map:2,9 在; 返回下标0,2。

Python:
python里的字典就像java里的HashMap,以键值对的方式存在并操作

class Solution:
    def twoSum(self, nums, target):
        map={}
        r=[]
        for i in range(0,len(nums)):
            complement=target-nums[i]
           
            if complement in map:
                #print(complement)
                r.append(map[complement])
                r.append(i)
                return r
         
            else :
                map[nums[i]]=i
哈哈哈 折腾了好久 不过总算是弄出来了
犯了个小错误 把增加map字典写成了map={nums[i]:i},所以每次map都在刷新而不是新增一个

蠢蠢的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值