Leetcode刷题第五天-二分法-回溯
215:第k个最大元素
链接:215. 数组中的第K个最大元素 - 力扣(LeetCode)
em~~怎么说呢,快速选择,随机定一个目标值,开始找,左边比目标小,右边比目标大,左右同时不满足时,交换左右位置,直到左指针比右指针大,交换目标和右指针位置的值,此时右指针位置即时目标值的在排序好数组中的位置,如果k在右边,左边界右移,k在左边,右边界左移
快排

1 class Solution:
2 def findKthLargest(self, nums: List[int], k: int) -> int:
3 if(not nums): return 0
4 lens=len(nums)
5 #倒数第k大,正数位置lens-k
6 tager=lens-k
7 left,right=0,lens-1
8 while left<=right:
9 i,j=left+1,right
10 flage=0
11 while i<=j:
12 #如果左大于目标,并且右小于目标,交换左右
13 if(nums[i]>=nums[left] and nums[j]<=nums[left]):
14 nums[i],nums[j]=nums[j],nums[i]
15 i+=1
16 j-=1
17 else:
18 #左小于目标,左+1,右大于目标,右-1
19 if(nums[i]<=nums[left]): i+=1
20 if(nums[j]>=nums[left]): j-=1
21 #目标比右大,交换目标和右
22 nums[left],nums[j]=nums[j],nums[left]
23 #如果结束的位置是tager,结束,大了找左,小了找右
24 if(j==tager): return nums[j]
25 elif(j>tager): right=j-1
26 else: left=j+1
findKthLargest
347:前k个高频元素
链接:347. 前 K 个高频元素 - 力扣(LeetCode)
em~~没啥

1 class Solution:
2 def topKFrequent(self, nums: List[int], k: int) -> List[int]:
3 if(not nums): return nums
4 data={x:0 for x in nums}
5 for item in data:
6 data[item]+=nums.count(item)
7 data=sorted(data.items(),key=lambda x:x[1] ,reverse=True)
8 re=[]
9 for i in range(k):
10 re.append(data[i][0])
11 return re
12
topKFrequent
451:根据字符出现频率排序
链接451. 根据字符出现频率排序 - 力扣(LeetCode)
347一样

1 class Solution:
2 def frequencySort(self, s: str) -> str:
3 data={x:0 for x in s}
4 for item in data:
5 data[item]+=s.count(item)
6 data=sorted(data.items(),key=lambda x:x[1],reverse=True)
7 re=''
8 for item in data:
9 re+=item[0]*item[1]
10 return re
frequencySort
75:颜色分类
后一个数小于前一个,交换,i-1,否做i+1

1 class Solution:
2 def sortColors(self, nums: List[int]) -> None:
3 """
4 Do not return anything, modify nums in-place instead.
5 """
6 if (not nums): return nums
7 lens=len(nums)
8 i=1
9 while i<lens:
10 if(i==0): i+=1
11 if(nums[i]<nums[i-1]):
12 nums[i],nums[i-1]=nums[i-1],nums[i]
13 i-=1
14 else:
15 i+=1
16 print(nums)
sortColors
开启回溯之旅
回溯理论知识引用:代码随想录 (programmercarl.com)


void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
77:组合
for i in (1,2,3,4)遍历
递归:每个结果长度=k,结束递归

1 class Solution:
2 def combine(self, n: int, k: int) -> List[List[int]]:
3 if(n==0): return []
4 re=[]
5 self.backtracking(n+1,k,1,[],re)
6 return re
7 def backtracking(self,n,k,startId,path,re):
8 if(len(path)==k):
9 re.append(path[:])
10 return
11 for i in range(startId,n):
12 path.append(i)
13 self.backtracking(n,k,i+1,path,re)
14 path.pop()
combine

1 class Solution:
2 def combine(self, n: int, k: int) -> List[List[int]]:
3 if(n==0): return []
4 re=[]
5 self.backtracking(n+1,k,1,[],re)
6 return re
7 def backtracking(self,n,k,startId,path,re):
8 if(len(path)==k):
9 re.append(path[:])
10 return
11 #说实话,这步减枝优化没看懂,在找一道题试试
12 #for i in range(startId,n-(k-len(path))+1):
13 for i in range(startId,n):
14 print(i,path)
15 path.append(i)
16 self.backtracking(n,k,i+1,path,re)
17 path.pop()
combine(优化)
216:组合总和III
链接:216. 组合总和 III - 力扣(LeetCode)
for i in (1-9)遍历
递归:相加,和大于n直接返回,小于n放入单次结果中

1 class Solution:
2 def combinationSum3(self, k: int, n: int) -> List[List[int]]:
3 if(not k or not n): return[]
4 re=[]
5 self.backtracking(1,n,k,[],re)
6 return re
7 def backtracking(self,startId,n,k,path,re):
8 if(len(path)==k):
9 if(sum(path)==n):
10 re.append(path[:])
11 return
12 for i in range(startId,10-(k-len(path))):
13 #如果和大于n,后面就没有必要做了,小于n
14 if(i+sum(path)<=n):
15 path.append(i)
16 self.backtracking(i+1,n,k,path,re)
17 path.pop()
18 else: return
combinationSum3
17:电话号码的字母组合
链接:17. 电话号码的字母组合 - 力扣(LeetCode)
for i in (一个数字对应的字母表)遍历
递归:单次结果的字符串按digits顺序相加

1 dicts={2:'abc',3:'def',4:'ghi',5:'jkl',6:'mno',7:'pqsr',8:'tuv',9:'wxyz'}
2 class Solution:
3 def letterCombinations(self, digits: str) -> List[str]:
4 if(not digits): return []
5 re=[]
6 self.backtracking(digits,'',re,0)
7 return re
8 def backtracking(self,digits,path,re,index):
9 global dicts
10 if(index==len(digits)):
11 re.append(path)
12 return
13 for strs in dicts[int(digits[index])]:
14 self.backtracking(digits,path+strs,re,index+1)
15
16
17
letterCombinations
39:组合总和
还是要传个index,第一个元素的下标,当前元素可以重复用,但是不能回头往前找

1 class Solution:
2 def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
3 if(not candidates): return []
4 re=[]
5 self.backtracking(candidates,target,[],re,0)
6 return re
7 def backtracking(self,candidates,target,path,re,index):
8 if(sum(path)==target):
9 re.append(path[:])
10 return
11 for i in range(index,len(candidates)):
12 num=candidates[i]
13 if(sum(path)<target):
14 path.append(num)
15 self.backtracking(candidates,target,path,re,i)
16 path.pop()
17 else: return
combinationSum
40:组合总和II
需要注意的是:每一层不能重复使用相同的元素,但是下一层可以重复用

1 class Solution:
2 def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
3 if(not candidates): return []
4 candidates.sort()
5 re=[]
6 self.backtracking(candidates,target,[],re,0)
7 return re
8 def backtracking(self,candidates,target,path,re,index):
9 if(sum(path)==target):
10 re.append(path[:])
11 return
12 for i in range(index,len(candidates)):
13 #每一次的迭代元素,不能重复,但是下一层递归中可以用
14 if(i>index and candidates[i]==candidates[i-1] ): continue
15 if(sum(path)<target):
16 path.append(candidates[i])
17 self.backtracking(candidates,target,path,re,i+1)
18 path.pop()
19 else: return
combinationSum2
Leetcode刷题第五天-二分法-回溯的更多相关文章
- LeetCode刷题模板(1):《我要打10个》之二分法
Author : 叨陪鲤 Email : vip_13031075266@163.com Date : 2021.01.23 Copyright : 未 ...
- LeetCode刷题总结之双指针法
Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...
- LeetCode刷题总结-数组篇(上)
数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...
- LeetCode刷题总结-树篇(上)
引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...
- LeetCode刷题的一点个人建议和心得
目录 1. 为什么我们要刷LeetCode? 2. LeetCode的现状和问题 3. 本文的初衷 4. LeetCode刷题建议 4.1入门数据结构,打基础阶段 4.2 建立 ...
- 看完互联网大佬的「LeetCode 刷题手册」, 手撕了 400 道 Leetcode 算法题
大家好,我是 程序员小熊 ,来自 大厂 的程序猿.相信绝大部分程序猿都有一个进大厂的梦想,但相较于以前,目前大厂的面试,只要是研发相关岗位,算法题基本少不了,所以现在很多人都会去刷 Leetcode ...
- LeetCode刷题专栏第一篇--思维导图&时间安排
昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...
- leetcode 刷题进展
最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多 前200的吃透了 足以应付非算法岗 ...
- LeetCode刷题指南(字符串)
作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
随机推荐
- 2022 开源之夏 | Serverless Devs 陪你“变得更强”
Serverless 是近年来云计算领域热门话题,凭借极致弹性.按量付费.降本提效等众多优势受到很多人的追捧,各云厂商也在不断地布局 Serverless 领域.但是随着时间的发展,Serverles ...
- 深度学习(三)——Transforms的使用
一.Transforms的结构及用法 导入transforms from torchvision import transforms 作用:图片输入transforms后,可以得到一些预期的变换 1. ...
- 【驱动】SPI驱动分析(四)-关键API解析
关键API 设备树 设备树解析 我们以Firefly 的SPI demo 分析下dts中对spi的描述: /* Firefly SPI demo */ &spi1 { spi_demo: sp ...
- Java 使用二分查找快速定位元素位置
转载请注明出处: 快速定位 一个有序数列中 某一个元素的位置: 共有三种思路: 第一种:使用 for 循环,匹配元素值 与循环变量的值是否相等,相等则循环变量时的 i 则为元素位置 第二种:使用 二分 ...
- 解决 idea maven plugins 报红波浪线
导入新项目到 idea 的时候,由于依赖的环境以及项目中 maven 编译所依赖的pom的版本不同,很多时候导入到idea的时候 maven Plugins 会出现报红的情况,这是由于maven仓库中 ...
- Java开发者的Python进修指南:JSON利器之官方json库、demjson和orjson的实用指南
JSON JSON作为目前最流行的传输格式,在Python中也有相应的实现方式.由于JSON格式的文本可以跨平台并且简单易用,因此被广泛传播.因此,我们今天的主要讨论内容是如何熟练地应用Python的 ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.02)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- [转帖]nginx反向代理时保持长连接
https://www.cnblogs.com/liufarui/p/11075630.html ·[场景描述] HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上 ...
- [转帖]一篇来自网络的关于“enqueue”events的简短参考
https://www.cnblogs.com/lhdz_bj/p/8716701.html 仅供自己和各位同学参考: Enqueue Type Description enq: AD - alloc ...
- [转帖]TiDB 配置参数修改与系统变量修改步骤
https://tidb.net/blog/bda86911 注意事项1:tidb-test 为集群名称 注意事项2:参数修改前与修改后备份.tiup目录 注意事项3:通过 tiup cl ...