主要例题与代码源于微信公众号:代码随想录
一些题的答案源于LeetCode题解区
1数组
1.1二分法–35
暴力法
def insert(nums,t):
for i in range(len(nums)):
if nums[i] >= t:
return i
**有序数组 ** 是二分查找的基础条件。
循环不变量
以下为 二分法的两种写法
def insert(nums,t):
l,r=0,len(nums-1)
while l<=r: #取等时,区间仍有定义
mid=l+(l+r)//2 #(取整,防止溢出)
if nums[mid]>t:
r=mid-1 #表明t在左区间
elif nums[mid]<t:
l=mid+1 #t在右区间
else:
return mid
def insert(nums,t):
l,r=0,len(nums-1)
while l<r:
mid=l+(l+r)//2
if nums[mid]>t:
r=mid
elif nums[mid]<t:
l=mid+1
else:
return mid
1.2移除元素–15
暴力法 有问题 跑不出来?
def removeElement(nums,t):
n=len(nums)
for i in range(n):
if nums[i]==t:#发现要移除的元素,将数组集体向前移动一位
for j in range(i+1,n-1):
nums[j-1]=nums[j]
i-=1
n-=1
return n
双指针法
def removeElement(nums,t):
n=len(nums)
p1,p2=0,0
for p1 in range(n):
if nums[p1]!=t:
nums[p2]=nums[p1]
p2+=1
return p2
例题l15
#l15三数之和
def threeSum(nums):
n=len(nums)
res=[]
if (not nums or n<3):
return []
nums.sort()#排序,使用双指针
#三次for循环复杂度过高,于是使用单for+双指针
for i in range(n):
if (nums[i]>0):#因为已经排序好,所以后面不可能有三个数加和等于0,直接返回结果。
return res
if (i>0 and nums[i]==nums[i-1]):
continue#跳过重复解
l=i+1
r=n-1
while l<r:
if (nums[i]+nums[l]+nums[r]==0):
res.append([nums[i],nums[l],nums[r]])
while (l<r and nums[l]==nums[l+1]):#判断断左界和右界是否和下一位置重复,去除重复解。
l+=1
while (l<r and nums[r]==nums[r-1]):
r-=1
l+=1
r-=1
elif(nums[i]+nums[l]+nums[r]>0):
r-=1
else:
l+=1
return res
1.3滑动窗口–209
暴力法 --超时
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
rl=[]
if not nums:
return 0
for i in range(len(nums)):
res=0
for j in range(i,len(nums)):
res+=nums[j]
if res>=s:
rl.append(j-i+1)
if rl:
return min(rl)
else:
return 0
滑动窗口 --可看做双指针的特例
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
n=len(nums)
p=0
res=0
rl=[]
if not nums:
return 0
for i in range(n):
res+=nums[i]
while res>=s:
rl.append(i-p+1)
res-=nums[p]
p+=1
if rl:
return min(rl)
else:
return 0
1.4螺旋矩阵–59
「本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。」
class Solution:
def generateMatrix(self, n: int) -> [[int]]:
l, r, t, b = 0, n - 1, 0, n - 1
mat = [[0 for _ in range(n)] for _ in range(n)]
num, tar = 1, n * n
while num <= tar:
for i in range(l, r + 1): # left to right
mat[t][i] = num
num += 1
t += 1
for i in range(t, b + 1): # top to bottom
mat[i][r] = num
num += 1
r -= 1
for i in range(r, l - 1, -1): # right to left
mat[b][i] = num
num += 1
b -= 1
for i in range(b, t - 1, -1): # bottom to top
mat[i][l] = num
num += 1
l += 1
return mat
Python列表切片妙解
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
def rotation(matrix):
return list(zip(*matrix[::-1]))
r,n=[[n*n]],n*n
while n>1:
new=[list(range(n-len(r),n))]
rot = rotation(r)
n-=len(r)
r=new+rot
return r
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
r, n = [[n**2]], n**2
while n > 1: n, r = n - len(r), [[*range(n - len(r), n)]] + [*zip(*r[::-1])]
return r
1.5数组总结
「数组是存放在连续内存空间上的相同类型数据的集合。」
996

被折叠的 条评论
为什么被折叠?



