
LeetCode刷题记录
本科商科,现已毕业,纯属小白;从两数之和开始,本专栏仅记录LeetCode刷题时的思考和总结。
Dreamcatcher风
路漫漫其修远
展开
-
LeetCode 628. 三个数的最大乘积
题目我的解答首先想到能不能用动态规划的方法来做,发现不会做。后来想到先排序,再处理。举了几个例子,发现乘积最大的三个数只会出现在数组收尾各三个元素中,那么用max()找出来即可。def func(): nums = [2,1,3,4,5,1,-2,-6,-5] n = len(nums) nums.sort() a = nums[0]*nums[1]*nums[2] b = nums[-1]*nums[-2]*nums[-3] ...原创 2021-07-10 11:47:40 · 162 阅读 · 0 评论 -
LeetCode 566. 重塑矩阵
题目我的解答暴力求解就好了。主要是注意Python创建多维数组的写法(不用numpy)、以及赋值和遍历的写法。def func(): nums = [[1,2], [3,4]] nums_c = len(nums[0]) nums_r = len(nums) r = 1 c = 4 if r*c != nums_r*nums_c: return nums new = [] ...原创 2021-07-07 20:10:32 · 140 阅读 · 0 评论 -
LeetCode 283. 移动零
题目我的解答思路:凡遇到0,就nums.pop()掉,同时设置一个count来记录总共删除了几个0,最后再nums.append()上。注意几个点:(1)每次pop,len(nums)都会发生变化,如果用for i in range(len(nums)),那么可能会出现所有超出范围的错误。我的解决办法是每一轮迭代都计算一次len(nums)。(2)最后的元素是不是0,对应pop和count的操作有一些区别。nums = [0,0,1,0,3,4,0,12,0,0,...原创 2021-07-07 19:55:10 · 125 阅读 · 0 评论 -
LeetCode 167. 两数之和 II - 输入有序数组
题目我的解答之前做过类似的题目:LeetCode 1. 两数之和,用的是查找表法,这道题同样可用,这两道题的区别是,这道题所给的数组已经升序排好了。def func(): nums = [1,2,3,5,6,8,11] target = 9 n = len(nums) dic = {} dic[nums[0]] = 0 for i in range(1,n): if target-nums[i] in dic:...原创 2021-07-07 17:35:15 · 138 阅读 · 0 评论 -
LeetCode 219. 存在重复元素 II
题目我的解答依旧使用查找表法,但和LeetCode 217. 存在重复元素不同的地方在于,217题只需要判断“是否存在重复元素”,无需考虑“如果有重复元素,但不符合条件,还有没有另一个重复元素?”而这道题就需要考虑这个问题。例如示例2,第一个1和第2个1就不满足条件,但第2个1和第3个1就满足了。思路:设置一个字典,key存放第i个元素,value存放元素在数组里的位置。如果遇到不满足条件的重复元素,那么当下次再遇到时,就把原先那个元素对应字典里的value改为新的重复元素在...原创 2021-07-04 20:51:57 · 182 阅读 · 0 评论 -
LeetCode 217. 存在重复元素
题目我的解答看到查找元素,再加上找的是重复元素,就想到了LeetCode 1. 两数之和这道题用的方法:查找表法。Python可以用字典代替哈希表。nums = [1,2,3,1] n = len(nums) nums_0 = nums[0] dic = {} dic[nums_0] = nums[0] for i in range(1,n): if nums[i] in dic.keys(): ...原创 2021-07-04 20:00:28 · 200 阅读 · 0 评论 -
LeetCode 121. 买卖股票的最佳时机
题目我的解答暴力求解,明显超时。比较好的答案方法:动态规划(或者叫贪心?)思路是:用记录0~所有元素的最小值,记录到目前为止,最大的利润是多少。相比暴力解法,这里的技巧就在于记录这个,暴力解法每次都需要找之前的最小元素,而贪心解法是用新进来的元素和之前的最小值比较,如果新进来的元素更小,就更新nums = [7,1,5,3,6,4]n = len(nums)min_price = nums[0]max_profit = 0for i in r...原创 2021-07-04 19:24:48 · 129 阅读 · 0 评论 -
LeetCode 122. 买卖股票的最佳时机 II
题目我的解答我想用动态规划的方法来做,但是不知道怎么着状态转移方程。其实不需要把这道题想复杂,只要考虑到:已经知道每一天的涨跌以及在买之前必须把先前的股票卖了。那么就自然会想到“波段操作”,只关注上涨的那一段,忽略下跌的那一段,最后就是只赚不亏。如图,只关注红色部分,黄色部分忽略。比较好的答案就用前面说的思路:nums=[7,1,5,3,6,4]n = len(nums)max_profit = 0for i in range(1,n): ...原创 2021-07-04 17:42:23 · 123 阅读 · 0 评论 -
LeetCode 88.合并两个有序数组
题目我的解答用的是暴力解法,思路是新建一个空数组new[],然后逐个比较nums1和nums2各个元素的大小,小的元素加入new中。LeetCode给的实例有点问题,示例1的nums1就不是有序数组,而且[1,2,3,0,0,0]的长度是6,不是3,我在程序里处理了这个问题,但线上提交就出错。(实在不想修改了)比较好的答案思路和我的差不多,只不过我不知道怎么把复杂度控制在O(n),看了答案后才知道我没想到的地方,就是这个while循环的条件:while p1...原创 2021-07-01 22:03:15 · 127 阅读 · 0 评论 -
LeetCode 53. 最大子序和
题目我的解答暴力求解,但超时了。for循环第一个if:如果第一个数就是负数,那么直接跳过,因为负数会让答案变小。nums = [-2,1,-3,4,-1,2,1,-5,4]max_ = 0n = len(nums)sum_ = 0tag = 0for i in range(n): j = i if nums[i] < 0: continue tag = 1 sum_ = nums[i] for j ...原创 2021-06-30 13:27:56 · 202 阅读 · 0 评论 -
LeetCode 27. 移除元素
题目我的解答用到两个循环,while循环的作用是进行一轮一轮地遍历,for循环的作用是遍历一次数组。定义一个指针j,用在for循环里。for循环:如果j位置的元素等于val,那么pop该元素,同时用tag标签指向删除的这个元素的位置,以至于下一轮遍历数组可以从tag位置开始。我的做法输出的最终的数组是真正删除了val的数组,官方答案输出的数组实际上有很多没用的元素。不过题目也说了,不需要考虑后面的那些元素。class Solution: def removeE...原创 2021-06-30 08:46:48 · 112 阅读 · 0 评论 -
LeetCode 1. 两数之和
题目我的解答暴力求解class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i in range(len(nums)-1): for j in range(i+1,len(nums)): if(nums[i]+nums[j] == target): ...原创 2021-06-29 20:07:02 · 215 阅读 · 0 评论 -
LeetCode 26. 删除有序数组中的重复项
题目我的解答因为所给数组已经排好序,那么先找到最大值,然后加1,设为max_num,这个数就是新的最大的数。循环遍历数组,如果有重复的,那么把重复的元素修改为max_num,最后得到的数组只有max_num是重复元素。然后对数组排序,所有max_num都跑到最后面了,然后删除这些max_num,得到答案。nums = [1,1,2]n = len(nums)count = 0max_num = nums[n-1]for i in range(n): ...原创 2021-06-29 19:12:56 · 108 阅读 · 0 评论