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,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
随机推荐
- 前端科普系列(5):ESLint - 守住优雅的护城河
作者:Morrain [前端科普系列]帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作. ...
- 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用
这是"领域驱动设计实践之路"系列的第四篇文章,从单体架构的弊端引入微服务,结合领域驱动的概念介绍了如何做微服务划分.设计领域模型并展示了整体的微服务化的系统架构设计.结合分层架构. ...
- Go ASM 学习笔记之 ppt 版
在 小白学标准库之反射 reflect 篇中介绍了接口和反射.然而,对于接口的类型转换,底层实现还是一知半解.在参考 Go 语言设计与实现 这本书接口章节时,又看不大懂.一个拦路虎摆在面前:汇编.不懂 ...
- linux 查看服务器cpu 与内存配置
转载请注明出处: 1. 通过 lscpu 命令查看 服务器的cpu 配置 显示格式: Architecture: #架构 CPU(s): #逻辑cpu颗数 Thread(s) per core: #每 ...
- python json.loads()、json.dumps()和json.dump()、json.load()区别
json.loads().json.dumps()和json.dump().json.load()分别是两组不同用法 带s的用于数据类型的转换,不带s的用于操作文件. json.loads().jso ...
- 2023强网拟态crypto-一眼看出
1.题目信息 一眼看穿 查看代码 from Crypto.Util.number import * from secret import flag import gmpy2 flag=b'' r = ...
- bootstrap : 响应式导航
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Laravel - 使用查询构造器查询
public function constructorQuery() { # 1,新增 DB::table('student')->insert([ ...
- [转帖]harbor 更改网段(docker-compose)
https://blog.csdn.net/Darkernote/article/details/119390862 问题:harbor 安装后网段冲突 docker-compose 一般安装会创建一 ...
- ARM下KVM虚拟化的损耗验证--redis
ARM下KVM虚拟化的损耗验证 摘要 看Windows 上面的 Workstation的虚拟机的 网络层的延迟特别高. 突然想之前统计都是直接在本地验证的, 只考虑了虚拟化CPU的性能损耗 没有考虑虚 ...