力扣刷题题解注意(5

本文讨论了如何使用Python解决LeetCode中的两数之和和四数相加II问题,重点介绍了利用字典存储元素和进行快速查找以降低时间复杂度的方法。作者强调了列表遍历的优化以及字典在处理大数和的效率提升。
摘要由CSDN通过智能技术生成

力扣1两数之和

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        a=[]
        for i in range(len(nums)):
            intentNum=target-nums[i]
            for j in range (len(nums)):
                if j!=i:#题目要求不可以两个序号为同一个
                    if(nums[j]==intentNum):#找到了两个数和为target
                        a=[i,j]
                        return a
        return a

1.刚看到题目的时候就想如果直接暴力能通过这道题目不是再简单不过了,提交之后发现真的可以暴力。

2.去找了力扣上面的题解,发现python对于列表遍历两次还有另外一种更为巧妙的方法,如下代码:

for i in range(len(nums)):
    res = target-nums[i]
    if res in nums[i+1:]:
        return [i, nums[i+1:].index(res)+i+1]

最后两行代码值得思考。

(1)首先是妙用了 element  in List 这个存在于python中的集成,但是可能大家对于nums[i+1:]有问题,为什么保证一定是另外一个索引在第一个索引之后?一定是这样的,因为题目明示了可以考虑只有一个答案,所以无论是2+3=5还是3+2=5都可以,找到一组就可以return,根本不存在重复的问题。

(2)其次就是对于result列表的返回。直接返回nums.index(res)难道不可以吗?当然不行,因为如果target=6,而列表中恰恰存在两个3,那么返回的结果必然是[第一个3的索引,第一个3的索引]。所以实际上从nums[i+1:]开始index是因为不希望第二个找到的元素和第一个索引重复。

力扣454四数相加II


class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        #使用字典存储nums1和nums2中的元素及其和
        hashmap = dict()
        for n1 in nums1:
            for n2 in nums2:
                if n1+n2 in hashmap:
                    hashmap[n1+n2] += 1#value+1
                else:
                    hashmap[n1+n2] = 1#默认dict初值为0
        # 如果 -(n1+n2) 存在于nums3和nums4, 存入结果
        count = 0#记录会有多少相加为0的结果
        for n3 in nums3:
            for n4 in nums4:
                key = -(n3 + n4)
                if key in hashmap:#相加为0那么定可以拆分成num和-num
                    count += hashmap[key]#找到了则把结果+1
        return count

1.本题在思考的时候和以上这篇力扣的题解思路相同,是打算将nums1和nums2相加,再将nums3和nums4相加,然后对于哈希表相比较,因为如果直接比较,目测复杂度为O(n3)。但是要思考的问题是nums[i]+nums[j]的和如果放到列表中那将是指数级的(见题目下面的要求)。所以用列表定然是不可行,所以题解作者使用了dict字典,好处在于key:value中的key并不需要是索引序列,所以即使和很大也仅仅作为一个key值。dict字典体现了对于key值的随意性。

2.对于dict的用法可以参考:Python字典(dict)详解_python dict-CSDN博客

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值