文章为记录刷代码随想录的过程,当做自己的笔记,实现代码为python3。如果大佬们有更好的方法欢迎评论留言。
Carl大佬的网站:https://www.programmercarl.com/
问题描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,
写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
代码实现:
# 方式1:左闭右闭区间
class Solution1:
def search(nums: list, target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
middle = (left + right) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1
else:
return middle
return -1
ex1 = Solution1.search(nums=[-1, 0, 3, 5, 9, 12], target=9)
ex2 = Solution1.search(nums=[-1, 0, 3, 5, 9, 12], target=2)
print(ex1)
print(ex2)
# 方式2:左闭右开区间
class Solution2:
def search(nums: list, target: int) -> int:
left, right = 0, len(nums)
while left < right:
middle = (left + right) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle
else:
return middle
return -1
ex3 = Solution2.search(nums=[-1, 0, 3, 5, 9, 12], target=9)
ex4 = Solution2.search(nums=[-1, 0, 3, 5, 9, 12], target=2)
print(ex3)
print(ex4)
问题描述:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
代码实现:
class Solution:
"""双指针法
时间复杂度:O(n)
空间复杂度:O(1)
"""
def removeElement(nums: list, val: int) -> int:
fast = slow = 0
while fast < len(nums):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
# 当 fast 指针遇到要删除的元素时停止赋值
# slow 指针停止移动, fast 指针继续前进
fast += 1
return slow
ex1 = Solution.removeElement(nums=[3,2,2,3], val=3)
print(ex1)
ex2 = Solution.removeElement(nums=[0,1,2,2,3,0,4,2], val=2)
print(ex2)
问题描述:
给你一个按非递减顺序 排序的整数数组 nums,返回每个数字的平方 组成的新数组,要求也按非递减顺序排序。
示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
代码实现:
class Solution:
def sortedSquares(nums:list) -> list:
n = len(nums)
i,j,k = 0,n-1,n-1
# 定义一个与nums长度相同的数组
ans = [-1] * n
while i <= j:
left_num = nums[i] ** 2
right_num = nums[j] ** 2
if left_num > right_num:
ans[k] = left_num
i += 1
else:
ans[k] = right_num
j -= 1
k -= 1
return ans
ex1 = Solution.sortedSquares(nums=[-4,-1,0,3,10])
print(ex1)
ex2 = Solution.sortedSquares(nums=[-7,-3,2,3,11])
print(ex2)
# 直接排序
class Solution:
def sortedSquares(nums:list) -> list:
return sorted(num * num for num in nums)
问题描述:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。
如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
代码实现:
# 双指针,滑动窗
class Solution:
def minSubArrayLen(s:int, nums:list) -> int:
"""
python中正无穷:float("inf"), 负无穷float("-inf")
类似在java中:Integer.MAX_VALUE表示int数据类型的最大取值数:2 147 483 647
Integer.MIN_VALUE表示int数据类型的最小取值数:-2 147 483 648
"""
# 定义一个无限大的数
result = float("inf")
sum = 0 # 子数组之和
left_index = 0
for i in range(len(nums)):
sum += nums[i]
while sum >= s:
result = min(result, i - left_index + 1) # 取子序列的长度
sum -= nums[left_index]
left_index += 1
return 0 if result==float("inf") else result
ex1 = Solution.minSubArrayLen(s=7,nums=[2,3,1,2,4,3])
print(ex1)
问题描述:
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
代码实现:
class Solution:
def generateMatrix(n:int ) -> list:
"""for _ in range(n)中 _ 占位符 表示不在意变量的值,只是用于循环遍历n次,无法打印变量值。"""
nums = [[0] * n for _ in range(n)] # 创建一个n维的矩阵,用0填充
# print(nums)
start_x, start_y = 0, 0 # 起始点
# 表示整数除法,其 3 / 2 = 1.5,对1.5 向下取整 = 1
loop, middle = n // 2, n // 2 # 迭代次数,n为奇数时矩阵的中心点
count = 1 # 计数
for offset in range(1, loop + 1): # 每循环一层偏移量加1,偏移量从1开始
for i in range(start_y, n - offset): # 从左至右,左闭右开
nums[start_x][i] = count
count += 1
for i in range(start_x, n - offset): # 从上到下
nums[i][n - offset] = count
count += 1
for i in range(n - offset, start_y, -1): # 从右到左
nums[n - offset][i] = count
count += 1
for i in range(n - offset, start_x, -1): # 从上到下
nums[i][start_y] = count
count += 1
start_x += 1 # 更新起始点
start_y += 1
if n % 2 != 0: # n为奇数时,单独给矩阵中心点赋值
nums[middle][middle] = count
return nums
ex = Solution.generateMatrix(3)
print(ex)