算法
数组
二分查找
举特殊例子来判断边界,长度为1时的情况
class Solution:
def search(self, nums: List[int], target: int) -> int:
#确定边界
l,r=0,len(nums)
#确定终止条件
while (l<r):
mid = (l+r)//2;
if (nums[mid]==target):
return mid
elif nums[mid]<target:
l=mid+1
else: r=mid
return -1
移除元素
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
class Solution:
#双指针,遇到目标值左指针记录,然后交换
def removeElement(self, nums: List[int], val: int) -> int:
n = len(nums)
l=0
for j in range(n):
if (not nums[j]==val):
nums[l]=nums[j]
l+=1
return l
有序数组的平方
给你一个按 非递减顺序 排序的整数数组 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(self, nums: List[int]) -> List[int]:
n = len(nums)
lst = [0]*n
l,r=0,n-1
for i in range(n-1,-1,-1):
if (nums[l]**2>=nums[r]**2):
lst[i]=nums[l]**2
l+=1
else:
lst[i]=nums[r]**2
r -= 1
return lst
长度最小的子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度**。**如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
class Solution:
#双指针法
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n = len(nums)
#首元素大于target直接返回1
if nums[0]>target: return 1
#判断唯一元素是否满足
if (n==1):
if nums[0]>= target:
return 1
else: return 0
l = 0
max_size = n+1
sum_nums = nums[l]
for r in range(1,n):
sum_nums+=nums[r]
#大于目标值则左指针向右减小窗口总和
while (sum_nums>=target):
max_size = min(max_size, r-l+1)
sum_nums-=nums[l]
l+=1
return 0 if max_size==n+1 else max_size
螺旋矩阵 II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
#创建返回数组
arr = [[0]*n for _ in range(n)]
num=1
#记录起始点
startx,starty = 0,0
#记录当前位置
x,y=0,0
#记录边界值
sub=1
for i in range(n//2):
for y in range(starty, n-sub):
arr[startx][y]=num
num+=1
#加一进入边界
y+=1
for x in range(startx, n-sub):
arr[x][y]=num
num+=1
x+=1
while (y>startx):
arr[x][y]=num
num+=1
y-=1
while (x>starty):
arr[x][y]=num
num+=1
x-=1
startx+=1
starty+=1
sub+=1
#若为奇数则中心添加最后值
if (n%2):
arr[startx][starty]=num
return arr
num+=1
x-=1
startx+=1
starty+=1
sub+=1
#若为奇数则中心添加最后值
if (n%2):
arr[startx][starty]=num
return arr