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,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
随机推荐
- Codeforces Round #719 (Div. 3) A~E题解
51鸽了几天,有几场比赛的题解还没发布,今天晚上会补上的 1520A. Do Not Be Distracted! 问题分析 模拟,如果存在已经出现的连续字母段则输出NO using ll = lon ...
- 智慧地产-售楼中心 3D 沙盘可视化
前言 随着"互联网+房地产"走入全国各大地产项目,房企依托互联网将房地产从传统地产转向智慧地产已然是眼下用户最欢迎的转型模式.智慧地产是由智慧社区.智慧园区.智慧公寓及智能家居等组 ...
- 上海丨阿里云 Serverless 技术实战营邀你来玩!
活动简介 本次沙龙深度探讨 "Serverless 在中国企业的落地和开发者实操" 主题,我们特别邀请了来自阿里云 一线技术专家,分享当前 Serverless 趋势和落地实践过程 ...
- <vue 组件 4、插槽的使用>
代码结构 一. 01-slot-插槽的基本使用 1. 效果 同样的一个插槽,父组件调用的时候不同展现的内容就不同 2.代码 01-slot-插槽的基本使用.html <!DOCTYPE ...
- ECS模式
大家好,本文提出了ECS模式.ECS模式是游戏引擎中常用的模式,通常用来组织游戏场景.本文出自我写的开源书<3D编程模式>,该书的更多内容请详见:Github 在线阅读 普通英雄和超级英雄 ...
- shell脚本(9)-流程控制for
一.循环介绍 for循环叫做条件循环,或者for i in,可以通过for实现流程控制 二.for语法 1.for语法一:for in for var in value1 value2 ...... ...
- 【南大静态代码分析】作业 2:常量传播和 Worklist 求解器
作业 2:常量传播和 Worklist 求解器 题目链接:https://tai-e.pascal-lab.net/pa2.html 评测链接:https://oj.pascal-lab.net/pr ...
- 【TouchGFX】使用CubeMX创建touchgfx项目 -- 初始篇
1.系统构成,黑色块表示组件非必须 2.环境准备 CubeMX:6.0.1 touchgfx:4.15.0 rt-thread:2020-8-14 commit Keil:5.30 board:stm ...
- Laravel - 创建项目
1,创建目录 ( 路径不要带有中文 ) 2,进入目录,执行下列命令 composer create-project --prefer-dist laravel/laravel project
- SV 并发线程
内容 assign d = a & b; assign e = b | c; begin...end之间的语句是串行执行的 fork....join语句是并行执行的 逻辑仿真工具中的并发性 仿 ...