目的:将各种算法例题重新理解一遍,加油。(语言:Python)
如果友友们想要查看例题详细解析和其他语言版本代码—> 《代码随想录》。
二分查找
1.给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target 。
写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
def main(lst,target):
left, right = 0, len(lst)
while left <= right: #(左闭右闭)
mid = (left+right)//2
if lst[mid] < target: #在mid右边,意味着要收紧left
left = mid + 1
elif lst[mid] > target: #在mid左边,意味着要收紧right
right = mid - 1
else:
return mid
return -1
lst = [-1,0,3,5,9,12]
target = 2
result = main(lst,target)
print(result)
#nums = [-1,0,3,5,9,12],result = 4
#nums = [-1,0,3,5,9,12],result = 2
有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,
要求也按 非递减顺序 排序。
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
def main(lst):
ans = [0] * len(lst) # 初始化
left, right = 0, len(lst) - 1 # 设置双指针下标
ans_index = len(lst) - 1 # 输出结果是升序,所以每次将大的数从后往前放置
while left <= right:
l_num = lst[left] ** 2
r_num = lst[right] ** 2
if l_num < r_num:
ans[ans_index] = r_num
right -= 1
else:
ans[ans_index] = l_num
left += 1
ans_index -= 1
return ans
lst = [-4, -1, 0, 2, 3, 10]
result = main(lst)
print(result)
#nums = [-4,-1,0,3,10],result = [0,1,9,16,100]
#nums = [-7,-3,2,3,11],result = [4,9,9,49,121]
长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s,找出该数组中满足其和 ≥ s
的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回0。
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
def main(lst,target):
sum,l = 0,len(lst)+1
left,right = 0,0
while right < len(lst):
sum += lst[right] #每次都尝试去往后加一个数
right += 1
while sum >= target: #只要>=target,就尝试去找最小的数组长度
l = min(l,right-left) #如果能找到更小的就更新l
sum -= lst[left]
left += 1
if l == len(lst)+1: #如果整个数组加起来<target,返回None
return 0
else:
return l
lst = [2,3,1,2,4,3]
target = 7
result = main(lst,target)
print(result)
#target = 7, nums = [2,3,1,2,4,3],result = 2
螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
输入: 3
输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
def main(n):
lst = [[0 for _ in range(n)] for _ in range(n)] #初始化列表
loop,mid = n//2,n//2 #转圈数,中心点(当n为奇数时需要)
start_x,start_y = 0,0 #第一圈外壳的起点初始化
count = 1
for offset in range(1,loop+1): #每画一个外壳,偏移量+1,往里缩一圈。
for i in range(start_y,n-offset): #每一条边都遵循左闭右开原则
lst[start_x][i] = count
count += 1
for j in range(start_x,n-offset): #看清楚每一行或列变的是什么就填for里面,也注意从哪到哪(方向)
lst[j][n-offset] = count #不变的先写(注意是start_x,还是n-offset),再把变的填上
count += 1
for k in range(n-offset,start_y,-1):
lst[n-offset][k] = count
count += 1
for l in range(n - offset,start_x,-1):
lst[l][start_y] = count
count += 1
start_x += 1 #为下一个外壳转圈圈做准备
start_y += 1
if n % 2 != 0: #如果是奇数边长,就要自己添加中心点
lst[mid][mid] = n**2
return lst
n = 3
result = main(n)
print(result)
#n = 3,result = [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
#n = 4,result = [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
免责声明:本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。
原文作者:作者 卡哥:链接: 代码随想录