记录LeetCode刷题

今天是2024.5.8,天气不好,当然也不坏。

我开始了刷题之旅。

首先开始了第一题,叫两数之和,具体需求如下:

当我看到这个题目就想到了用暴力解法?错,我想到了直接看题解,是的,我不想思考,想直接获得,我知道这是错误的,但还是这样做了。

看过题解后,暴力解法直接干,如下:

class Solution {

    public int[] twoSum(int[] nums, int target) {

        int len = nums.length ;

        for(int i = 0 ; i < len -1 ; i++){

            for (int j = i + 1; j < len  ; j++){

                if(nums[j] + nums[i] == target){

                    return new int[]{i,j};

                }

            }

        }

        return new int[0];

    }

}

 这里值得注意的就是j的起始条件了,由于是从前向后遍历的,所以遍历第二个元素的时候直接从第一个元素的下一个位置开始就可以啦!所以就有了j = i + 1。为啥到 len 而不是len - 1呢,我问了GPT,GPT给出了答案:

循环条件 j < len 是为了确保 j 的取值范围在有效的索引范围内。因为在第一个循环中,i 的取值范围是从 0 到 len - 1,所以 j 的取值范围需要从 i + 1 开始,以避免重复计算已经比较过的元素对。如果 j 的取值超过了 len - 1,那么就会越界访问数组,导致错误。

因此,循环条件 j < len 是为了确保 j 的取值在有效范围内,遍历了数组中 i 之后的所有元素。这样可以避免重复计算,并且完整地遍历了数组中的所有可能的元素对,以寻找满足条件的和为 target 的元素对。

总结起来,循环条件 j < len 是为了避免越界访问数组,并且确保遍历了所有可能的元素对,以找到满足条件的和为 target 的元素对。

 画个图就清晰多了嘿嘿。

 最后记得return new int[0];不然没有返回值会报错滴。

以上暴力解法所用时间复杂度为O(n^{2}),空间复杂度为O(1)。

基于以上,我又看了快速的解法,就是使用哈希表来存储,这样时间时间复杂度缩短为O(N)。当然空间复杂度就增加了,变为O(N)。

这里我理解到李叔同的 人生哪能多如意,万事只求半称心。

言归正传,开写!

public int[] twoSum(int[] nums, int target) {

        Map<Integer,Integer> hs =  new HashMap<Integer,Integer>();

        int len = nums.length;

        for(int i = 0 ; i< len  ; ++i){

            if(hs.containsKey(target - nums[i])){

                return new int [] {hs.get(target - nums[i]) , i};

            }

            hs.put(nums[i],i);

        }

        return new int [0];

    }

这里面主要是创建哈希表,想象哈希表是个一块一块分布的大盒子,每次遍历元素,判断目标值减去现在在nums数组拿出来的元素的值在不在哈希表里,如果在,那么返回元素索引,不在那就放到哈希表里面。

最后,这是我第一次写博客,很开心,我知道写的不太行,这么简单的题有啥好写的。我还是写了。

  • 36
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值