Leetcode(Python):sum类问题

Twosum

解题思路:我构建了一个字典,该字典用于记录。字典的键是target减去当前num,对应的值是此时num的index(因为这个题目需要我们返回的就是index)。当下次出现第二个num在字典中出现时,说明这个num的index和上次记录的target-num的那个index就是我要输出的东西。
这里写图片描述

Threesum

要求将数组中3个元素加起来为零的所有组合都挑选出来,但不能够重复。为了使得结果不重复,解决方案里做了两处代码书写。因为整体的代码结构(也就是循环逻辑)是第一层循环是排序后的数组元素,第二层循环是除去当前这个数组元素(因为当前这个数组元素已经被作为结果中的第一个target了)后面剩下的数组进行循环(其实这个第二层循环就是一个Twosum问题,与Twosum唯一不同的就是需要有个防止重复的操作)。
不重复1:紧接着第一层循环需要判断连续两个数组值是否相等,若是相等就可以不用选第一个直接选下一个就行(利用continue跳出当前循环)
不重复2:在第二层循环的过程中需要有一个not_same_list这样一个判断,怎么执行呢?在第二层循环中由于此时第一个元素是固定的,而需要加入到最后结果的时候,此时第二个元素也是固定的,因此我要判断一下当前的第三个元素在之前产生的结果中是否出现过。(所以not_same_list中需要在每次产生可行结果时,将第三个元素append进去)
这里写图片描述
上面的截图使用的是如Twosum那边的那种将信息保存到path矩阵的这种方法。
还有一种主流的方法就是利用Two_pointer:这种方法中把t = 0-nums[i]中的0改成target就编程了正常的3sum问题了~
这里写图片描述

ThreesumClosest

该方法的核心在于先将array排序,然后利用twopointer(left and right)遍历整个array,而pointer的移动准则是判断当前3个数的和与目标的大小,若当前三个数的和小于目标值,则这三个数需要更大,所以left指针加一;反之right指针减一。
这里写图片描述

4sum

这个方法就是继承与3sum的(基于two_pointer的方法而不是继承与存储path信息的方法),在foursum里面只要对前面部分(除去后三个)的部分进行循环,摘掉第一个后对后面的数进行3sum函数,再把返回值加上那个第一个。
这里写图片描述

4sum_2

利用hashtable方式做题,想法如下思路简单明了。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qiu931110/article/details/80079980