283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
思路:定义快慢指针,快指针指向非0位置,慢指针指向0位置进行交换,最终能保证所有的0都放在最后
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
i = j = 0
while j < n:
if nums[j]:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j += 1
11. 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明: 你不能倾斜容器。
思路:要使得水量最大,j - i, height[i]和height[j]也要尽可能大,可以让i=0,j=n-1,当height[j]较大时,让指针i右移;height[i]较大时,让指针j左移。每次记录水量为min(height[i],height[j]) * (j-i)返回最大值。
class Solution:
def maxArea(self, h: List[int]) -> int:
n = len(h)
i = res = 0
j = n - 1
while i < j:
res = max(res, (j - i) * min(h[i], h[j]))
if h[i] > h[j]:
j -= 1
else:
i += 1
return res
15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意: 答案中不可以包含重复的三元组。
思路:这个题细节好多,值得我做十遍。 思路:如果是两个数字的和为0,我们可以将数组排序,当两数之和大于0时,让右指针左移。小于0时,让左指针右移。
类比一下,如果求三个数字的和,我们给数组排序,先固定一个数字nums[i],然后进行双指针运算。
在指针移动的过程中,要保证三元组不重复,要保证当前循环下不能再选择相同的元素。只要保证nums[i]、nums[j]不相同,nums[k]一定会不相同。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
nums.sort()
res = []
for i in range(n):
if i and nums[i] == nums[i - 1]:
continue
j, k = i + 1, n - 1
while j < k:
while j > i + 1 and j < n and nums[j] == nums[j - 1]:
j += 1
if j >= k:
break
t = nums[i] + nums[j] + nums[k]
if t > 0:
k -= 1
elif t < 0:
j += 1
else:
res.append([nums[i], nums[j], nums[k]])
j += 1
return res