Leetcode-1.Two Sum

题目连接:

https://leetcode-cn.com/problems/two-sum/

C#实现

  • 暴力法
public class Solution {
    public int[] TwoSum(int[] nums, int target) {
        for(int i = 0;i < nums.Length - 1;i ++) {
            for(int j=i+1;j<nums.Length;j++){
                if (nums[i] + nums[j] == target){
                    return new int[2] {i,j};
                }
            }
        }
        return new int[2];
    }
}
  • hash法
public class Solution {
    public int[] TwoSum(int[] nums, int target) {
        Hashtable ht=new Hashtable();
        for(int i = 0;i < nums.Length;i ++) {
            int complement = target - nums[i];
            if(ht.ContainsKey(complement)){
                return new int[] {Convert.ToInt32(ht[complement]), i};
            }
            ht[nums[i]] = i;
        }
        throw new Exception("No result");
    }
}

python实现

  • 暴力法
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        nums_len = len(nums)
        for i in range(nums_len - 1):
            for j in range(i + 1, nums_len):
                if nums[i] + nums[j] == target:
                    return [i, j]
        return []
  • hash法
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        map = {}
        for i in range(len(nums)):
            complement = target - nums[i]
            if complement in map.keys():
                return [map[complement], i]
            map[nums[i]] = i
        return []

官方解析:

https://leetcode-cn.com/problems/two-sum/solution/

这个题目如果使用暴力法,其实很简单,但就算法而言并不是一个好的方法。官方题解给出了三种方式的解析,这里不再复述。需要注意的是,题目中给定的假设:假设每种输入只会对应一个答案。这就避免了一个多解的问题,从而避开了数组中有重复值导致多解,我们只管求出一个解就可以。以数组值作为hashmap的key时,如果key重复无法求出多个解。

在使用C# hashtable时同样也要注意,如果key重复,在Add方法时会抛出异常。

一个有意思的事情:在这道题中使用了C#和python两种语言实现,可以看到python的代码语义相当简洁易懂

给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时间复杂度为O(n^2),空间复杂度为O(1)。 思路2:哈希表 为了优化时间复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时间复杂度为O(n),空间复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时间复杂度为O(nlogn),空间复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空间使用,则暴力法是最简单的方法。如果数组较大或者需要优化时间复杂度,则哈希表或双指针方法更合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值