《代码随想录》刷题记录
https://github.com/youngyangyang04/leetcode-master/tree/master
数组:704.二分查找
数组 分治
递归版本,实际上可以写迭代版本的
class Solution:def search(self, nums: List[int], target: int) -> int:return self.binary_search(nums, 0, len(nums) - 1, target)def binary_search(self, nums, left, right, target):if left > right or right < left:return -1mid = (left + right) // 2if target == nums[mid]:return midelif target < nums[mid]:return self.binary_search(nums, left, mid - 1, target)else:return self.binary_search(nums, mid + 1, right, target)
数组:27.移除元素
数组 双指针
class Solution:def removeElement(self, nums: List[int], val: int) -> int:if not nums:return 0left, right = 0, len(nums) - 1if left == right:return left - (nums[left] == val) + 1while left < right:if nums[left] !=val:left += 1elif nums[right] == val:right -= 1else:nums[left], nums[right] = nums[right], nums[left]left += 1right -= 1return left - (nums[left] == val) + 1
数组:977.有序数组的平方
数组 双指针
class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:# 若所有为正数,正序平方返回,负数,逆序平方返回# 正负均有,找到边界,对比绝对值返回if len(nums) == 1:return [nums[0] * nums[0]]if nums[0] <= 0 and nums[-1] <= 0:res = []for i in range(len(nums) - 1, -1, -1):res.append(nums[i] * nums[i])return reselif nums[0] >= 0 and nums[-1] >= 0:return [n * n for n in nums]else:i = 0while i < len(nums):if nums[i] >= 0:i -= 1breaki += 1j = i + 1res = []while i >= 0 or j < len(nums):if i >= 0 and j < len(nums):if nums[i] * nums[i] > nums[j] * nums[j]:res.append(nums[j] * nums[j])j += 1else:res.append(nums[i] * nums[i])i -= 1elif i >= 0:res.append(nums[i] * nums[i])i -= 1else:res.append(nums[j] * nums[j])j += 1return res
数组:209.长度最小的子数组
数组 滑动窗口
class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:l = len(nums) + 1sumary = nums[0]left = right = 0while -1 < left <= right < len(nums):if sumary >= target:l = min(l, right - left + 1)left += 1if left <= right:sumary -= nums[left - 1]else:breakelse:right += 1if right < len(nums):sumary += nums[right]else:breakif l > len(nums):return 0else:return l
数组:区间和
前缀和
n = 0
nums = []
questions = []try:n = int(input())for _ in range(n):nums.append(int(input()))while True:r = input().split(" ")questions.append((int(r[0]), int(r[1])))except EOFError:passprefix_sum = [0] * len(nums)
for i in range(1, len(nums)):prefix_sum[i] = prefix_sum[i - 1] + nums[i - 1]for a, b in questions:print(prefix_sum[b] - prefix_sum[a] + nums[b])
数组:开发商购买土地
数组 前缀和
数组:螺旋矩阵
数组 模拟
特别注意矩形情况最内圈的边界条件
class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:res = []m, n = len(matrix), len(matrix[0])c = min(math.ceil(m / 2), math.ceil(n / 2))for i in range(c):x, y = i, i - 1y += 1if not (y < n - i):return reswhile y < n - i:res.append(matrix[x][y])y += 1y -= 1x += 1if not (x < m - i):return reswhile x < m - i:res.append(matrix[x][y])x += 1x -= 1y -= 1if not (y > i - 1):return reswhile y > i - 1:res.append(matrix[x][y])y -= 1y += 1x -= 1if not (x > i):return reswhile x > i:res.append(matrix[x][y])x -= 1return res