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:颜色分类

链接:75. 颜色分类 - 力扣(LeetCode)

后一个数小于前一个,交换,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:组合

链接:77. 组合 - 力扣(LeetCode)

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:组合总和

链接:39. 组合总和 - 力扣(LeetCode)

还是要传个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

链接:40. 组合总和 II - 力扣(LeetCode)

需要注意的是:每一层不能重复使用相同的元素,但是下一层可以重复用

 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刷题第五天-二分法-回溯的更多相关文章

  1. LeetCode刷题模板(1):《我要打10个》之二分法

    Author       :  叨陪鲤 Email         : vip_13031075266@163.com Date          : 2021.01.23 Copyright : 未 ...

  2. LeetCode刷题总结之双指针法

    Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...

  3. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  4. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

  5. LeetCode刷题的一点个人建议和心得

    目录 1.    为什么我们要刷LeetCode? 2.    LeetCode的现状和问题 3.    本文的初衷 4.    LeetCode刷题建议 4.1入门数据结构,打基础阶段 4.2 建立 ...

  6. 看完互联网大佬的「LeetCode 刷题手册」, 手撕了 400 道 Leetcode 算法题

    大家好,我是 程序员小熊 ,来自 大厂 的程序猿.相信绝大部分程序猿都有一个进大厂的梦想,但相较于以前,目前大厂的面试,只要是研发相关岗位,算法题基本少不了,所以现在很多人都会去刷 Leetcode ...

  7. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  8. leetcode 刷题进展

    最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多  前200的吃透了 足以应付非算法岗 ...

  9. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  10. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

随机推荐

  1. 【每日一题】28. 模拟战役 (模拟 + DFS/BFS/并查集)

    补题链接:Here 本题属于一道模拟题 虽然这题介绍一大堆,总结起来就是几句话,给出地图n列,前4行是a的地盘,后四行是b的地盘,每个人地盘上面有星号代表大炮. 大炮会 3 * 3的波及周围,会一直传 ...

  2. 【每日一题】2.合并回文子串 (字符串处理 + 区间DP)

    题目链接:Here 遇到这种数据范围较小的计数问题应该优先考虑dp,本题就是如此. 那么应该怎么样考虑转移呢? 首先最后C中的那个价值最大的子串一定是由字符串A的一个区间和字符串B的一个区间合并得到的 ...

  3. OAuth2.0回调函数用html页面转发给controller

    OAuth2.0授权中有个回调函数,就是请求授权服务后,它会将你需要的code(假设code就是你需要的数据)发送给你的回调函数(你对外开放的一个url地址用以接收参数) 注:这个回调函数有点讨厌为什 ...

  4. SpringCloud学习 系列一、 前言-为什么要学习微服务

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  5. vue学习笔记 十、状态管理基础结构

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  6. Python追踪内存占用

    技术背景 当我们需要对python代码所占用的内存进行管理时,首先就需要有一个工具可以对当前的内存占用情况进行一个追踪.虽然在Top界面或者一些异步的工具中也能够看到实时的内存变化,还有一些工具可以统 ...

  7. TCP连接状态的多种判断方法

    ​ 前言 在TCP网络编程模型中,无论是客户端还是服务端,在网络编程的过程中都需要判断连接的对方网络状态是否正常.在linux系统中,有很多种方式可以判断连接的对方网络是否已经断开. 通过错误码和信号 ...

  8. Qt5.9 UI设计(五)——将Tabwidget与treeWidget相互关联

    前言 前面一章介绍了ControlTabWidget ControlTreeWidget maintitlebar 三个子页面同时布局到 mainwindow 的方法,本章介绍如何将ControlTr ...

  9. [转帖]oracle查询表变化量

    根据变化量,可确定表的繁忙度,以及作为判断可能数据增长的对象. select obj.owner, obj.object_name, to_char(sn.BEGIN_INTERVAL_TIME,'y ...

  10. [转帖]JVM 输出 GC 日志导致 JVM 卡住,我 TM 人傻了

    https://www.jianshu.com/p/51380e04eab1 最近,我们升级了 Java 17.后来,我们的 k8s 运维团队为了优化我们的应用日志采集, 将我们所有 pod (你可以 ...