ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LeetCode 热题 100-简单题

LeetCode 热题 100-简单题 1. 两数之和给定一个整数数组nums和一个整数目标值target请你在该数组中找出和为目标值target的那两个整数并返回它们的数组下标。你可以假设每种输入只会对应一个答案并且你不能使用两次相同的元素。你可以按任意顺序返回答案。暴力解法class Solution: def twoSum(self, nums: List[int], target: int) - List[int]: len1len(nums) for a in range(0,len1): for b in range(a1,len1): if nums[a]nums[b]target: return [a,b]官方题解最底下还有一行return [ ],保证题目有解增强代码健壮性。283. 移动零给定一个数组nums编写一个函数将所有0移动到数组的末尾同时保持非零元素的相对顺序。请注意必须在不复制数组的情况下原地对数组进行操作。class Solution: def moveZeroes(self, nums: List[int]) - None: len1len(nums) for i in range(len1): if nums[i]0: nums.pop(i) nums.append(0) ii-1 return nums这是我初始的代码可以通过部分案例。明明可以通过[0,1,0,3,2]的测试却不能通过[0,0,1]。怀疑无法通过连续0。也就是说for循环回不去原来的i值哪怕我写了ii-1。拿[0,0,1]举例第一个 0 被 pop数组整体左移第二个 0 跑到下标 0但 for 循环 i 已经走到 1再也不会回头访问下标 0,所以会漏掉第二个0。。所以在这里要使用while循环手动控制i变量ii-1才会生效。用while循环的话需要提前声明i0。class Solution: def moveZeroes(self, nums: List[int]) - None: len1len(nums) i0 while i len1 : if nums[i]0: nums.pop(i) nums.append(0) len1 -1 else: i 1 return nums题解给的答案是双指针。我还没悟透。136. 只出现一次的数字给你一个非空整数数组nums除了某个元素只出现一次以外其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题且该算法只使用常量额外空间。class Solution: def singleNumber(self, nums: List[int]) - int: len1 len(nums) if len11: return nums[0] for i in range(0,len1): for j in range(i1,len(nums)): if nums[i] nums[j]: break return nums[i]//通过47/61个案例刚开始不明白为什么错案例也一直没通过。后来发现如果j在i后面范围那如果前面出现同样的值就无法确定。所以i和j应该是同样的rangelen1并且加上附加条件:nums[i]nums[j] and i!j.class Solution: def singleNumber(self, nums: List[int]) - int: len1 len(nums) if len11: return nums[0] for i in range(len1): isture 1 for j in range(len1): if nums[i] nums[j] and i !j: isture 0 break if isture 1: return nums[i]更改后可通过。但是时间复杂度是O(n^2)不符合题目要求的线性时间复杂度。题目同时还要求常数空间复杂度。题解给出了位运算。太天才了。python需要给出的答案甚至只有一行class Solution: def singleNumber(self, nums: List[int]) - int: return reduce(lambda x, y: x ^ y, nums)展开就是这样class Solution: def singleNumber(self, nums: List[int]) - int: res 0 for num in nums: res res ^ num//异或运算 return res异或运算^a ^ a 0两个相同数字异或结果为 0a ^ 0 a数字和 0 异或等于本身满足交换律、结合律169. 多数元素给定一个大小为n的数组nums返回其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋的元素。你可以假设数组是非空的并且给定的数组总是存在多数元素。这道题我刚开始的想法是把每一个元素出现的次数找出来然后把次数与n/2对比大于就是。但我发现不是很好操作。于是我看了题解。发现一个摩尔投票法的概念很好理解。当前数记为众数如果遇到这个数那么1如果不是就-1.因为众数大于n/2所以最后一定是正值。class Solution: def majorityElement(self, nums: List[int]) - int: count 0 x 0 for i in nums: if count 0: x i if i x: count 1 else: count - 1 return x举例如果数组是[1,0,0,1,5,5,5]这样count值就会是1010123。遍历数组要是正值被抵消就说明当前值不是众数不被抵消就直接输出。15. 三数之和给你一个整数数组nums判断是否存在三元组[nums[i], nums[j], nums[k]]满足i ! j、i ! k且j ! k同时还满足nums[i] nums[j] nums[k] 0。请你返回所有和为0且不重复的三元组。注意答案中不可以包含重复的三元组。class Solution: def threeSum(self, nums: list[int]) - list[list[int]]: len1len(nums) count 0 if len1 2: return [] for i in nums: for j in nums: j!i for k in nums: k!i,k!j if i jk 0: count1 if count 0: return [] for i in nums: for j in nums: j!i for k in nums: k!i,k!j if i jk 0: count1 return [i,j,k]这是我最先开始的代码只能输出一组答案而且没有最外层[ ]。也没有去重。三重暴力很容易超时。这道题好像只能用双指针。class Solution: def threeSum(self, nums: List[int]) - List[List[int]]: res [] nums.sort() n len(nums) for i in range(n): # i去重和上一个相同就跳过 if i 0 and nums[i] nums[i-1]: continue left i 1 right n - 1 while left right: s nums[i] nums[left] nums[right] if s 0: res.append([nums[i], nums[left], nums[right]]) # left去重 while left right and nums[left] nums[left1]: left 1 # right去重 while left right and nums[right] nums[right-1]: right - 1 left 1 right - 1 elif s 0: left 1 else: right - 1 return res双指针我一直不太懂。慢慢看能看明白但自己写不出来。我需要一点时间再理解一下。
返回列表