leetcode【简单】1、两数之和

题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
在这里插入图片描述
解法1:暴力解法,两层遍历,第二层只需遍历第一层取的数以后的数,用时6440ms

class Solution:
	def twoSum(self,nums,target):
		n = len(nums) 
		for x in range(n): 
			for y in range(x+1,n): 
				if nums[x] + nums[y] == target: 
					return x,y
					break 
				else: 
					continue 

解法二:一次循环,使用index函数获取角标,用时476ms

class Solution:
    def twoSum(self,nums, target): 
        j=-1       
        for i in range(1,len(nums)):
            temp = nums[:i]#i是num1,从i开始倒叙遍历前面的数(遍历后面也行)
            if (target - nums[i]) in temp:#如果另一个数存在
                j = temp.index(target - nums[i])
                break
        if j>=0:
            return [j,i]

解法三:通过哈希来求解,这里通过字典来模拟哈希查询的过程。
个人理解这种办法其实就是字典记录了 num1 和 num2 的值和位置,遍历同时查字典,而省了再查找 num2 索引的步骤,num2 不需要在整个 dict 中去查找,可以在 num1 之前的 dict 中查找,因此就只需要一次循环可解决。用时48ms

class Solution:
    def twoSum(self, nums, target):
        dct={}#相当于hashmap
        for i,n in enumerate(nums):
            t=target-n#i是num1的标,t是num2的值,在num1之前查找num2
            if t in dct:
                return [dct[t],i]
            else:
                dct[n]=i#用dct存放角标,省去索引num2的时间
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer>map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if (map.containsKey(target-nums[i])){
                return new int[]{map.get(target-nums[i]),i};
            }
            map.put(nums[i],i);
        }
        return new int[0];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值