Leetcode刷题第三天-贪心-双指针
738:单调递增
链接:738. 单调递增的数字 - 力扣(LeetCode)
嘶~介个介个恶心心,从后往前遍历,前一个数比当前数大,前一个数-1,当前数变为9
需要注意的是,保证每个9后面全是9
100,第一轮遍历完时90T_T

1 class Solution:
2 def monotoneIncreasingDigits(self, n: int) -> int:
3 if(n<10): return n
4 nums=[]
5 tmp=n
6 while tmp:
7 nums.insert(0,tmp%10)
8 tmp=tmp//10
9 lens=len(nums)
10 i=lens-1
11 flage=False
12 while i>0:
13 if(nums[i-1]>nums[i]):
14 nums[i-1]-=1
15 nums[i]=9
16 flage=True
17 i-=1
18 n=0
19 start=False
20 for i in range(lens):
21 if(flage and nums[i]==9):
22 start=True
23 if(start):
24 n=n*10+9
25 else:
26 n=n*10+nums[i]
27 return n
monotoneIncreasingDigits
968:监控二叉树
吐了,真的吐了,从未见过如次厚颜无耻之题
先是统计了每层节点个数,想按层安装,但是会出现子层节点少于父层节点,若在子层节点安装,还需要计算父-父层,跳不出来了T_T
然后迭代,后序遍历T_T左在前,左空的时候直接安到根上,右丢了,右在前,左空了,又跑根上了
最后递归,俩孩子有一个没有被覆盖,父就要安,俩孩子都被覆盖到了,父歇着就好,等待后续判断要不要安,其他情况父被覆盖,最后返回根的左右俩孩子状态,俩孩子都是0,根安T_T我真的已经哭死了

1 # Definition for a binary tree node.
2 # class TreeNode:
3 # def __init__(self, val=0, left=None, right=None):
4 # self.val = val
5 # self.left = left
6 # self.right = right
7 class Solution:
8 def minCameraCover(self, root: Optional[TreeNode]) -> int:
9 re=[0]
10 if(self.help(root,re)==0): re[0]+=1
11 return re[0]
12
13 def help(self,root,re):
14 if(not root): return 2
15 left=self.help(root.left,re)
16 right=self.help(root.right,re)
17 #左右都有覆盖,当前什么都不做
18 if(left==2 and right==2):
19 return 0
20 #左右有一个没覆盖,自己有摄像头
21 elif(left==0 or right==0):
22 re[0]+=1
23 return 1
24 else:
25 #左右有一个摄像头,自己被覆盖
26 return 2
minCameraCover
更新迭代做法
利用数组(python没有栈,数组就好)pop()取最后加入数组得元素,按照【根空右左】顺序加入数组,左右节点空不加,在根节点后面加入一个空值作为标记,当从数组种取出得元素为空时,证明他的左右节点已经判断完,需要对当前节点进行判断

1 # Definition for a binary tree node.
2 # class TreeNode:
3 # def __init__(self, val=0, left=None, right=None):
4 # self.val = val
5 # self.left = left
6 # self.right = right
7 class Solution:
8 def minCameraCover(self, root: Optional[TreeNode]) -> int:
9 if(not root): return 0
10 sums=0
11 stack=[root]
12 while stack:
13 cur=stack.pop()
14 if(cur):
15 stack.append(cur)
16 #插入一个空节点,作为标记,遇到空节点就要开始判断是否安摄像头
17 stack.append(None)
18 #左右孩子入栈,空不入
19 if(cur.right): stack.append(cur.right)
20 if(cur.left): stack.append(cur.left)
21 else:
22 #遇到空,继续取最后一个,判断自己是否安
23 cur=stack.pop()
24 left,right=2,2
25 if(cur.left): left=cur.left.val
26 if(cur.right): right=cur.right.val
27 if(left==0 or right==0):
28 sums+=1
29 cur.val=1
30 elif(left==2 and right==2):
31 cur.val=0
32 #栈空,说明到最后一个根节点,左右孩子被覆盖但是没有摄像头,自己没有被覆盖,所以自己还要安一个
33 if(not stack): sums+=1
34 else:
35 cur.val=2
36 return sums
stack

不行了,需要换个脑子了,开始双指针之旅
167:两个数之和
链接:167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)
(⊙﹏⊙)就两头开始加

1 class Solution:
2 def twoSum(self, numbers: List[int], target: int) -> List[int]:
3 if(not numbers): return numbers
4 left,right=0,len(numbers)-1
5 while True:
6 if(left==right): break
7 if(numbers[left]+numbers[right]==target): return [left+1,right+1]
8 elif(numbers[left]+numbers[right]>target): right-=1
9 else: left+=1
10 return []
11
12
twoSum
142:环形链表
链接:142. 环形链表 II - 力扣(LeetCode)
俩个指针,快的每次走两步,慢的每次走一步,链表有环,快的会再比慢的多走n个环的距离时相遇(跑步套圈)
找环的入口:从头再来一个指针3,也是每次都走一步,指针3和慢指针相遇的时候,比慢指针少走了一个环,相遇位置就是环口

1 # Definition for singly-linked list.
2 # class ListNode:
3 # def __init__(self, x):
4 # self.val = x
5 # self.next = None
6
7 class Solution:
8 def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
9 if(not head): return None
10 start,link=head,head
11 while link and link.next:
12 link=link.next.next
13 start=start.next
14 if(link==start):
15 start=head
16 while start!=link:
17 start=start.next
18 link=link.next
19 return link
20 return None
21
22
detectCycle
76:最小覆盖字串
更新更新,把一坨更新了一下,终于可以看清了T_T

1 class Solution(object):
2 def minWindow(self,s,t):
3 if(not s): return ""
4 #t长度,要找到得字符得个数
5 lent=len(t)
6 lens=len(s)
7 if(lens<lent): return ""
8 #记录t中每个字母出现得频率
9 flage={x:t.count(x) for x in t}
10 left,minleft,minright=0,-1,lens
11 for right in range(lens):
12 #遍历s,开始移动右边界,如果当前得字符在t中,对应频率数组-1,如果频率大于0,要找得字符个数-1
13 if(s[right] in t):
14 flage[s[right]]-=1
15 if(flage[s[right]]>=0): lent-=1
16 #要找得字符个数为0时,当前[left,right]范围内包含全部得t中字符,闭区间
17 if(lent==0):
18 while left<=right:
19 #开始移动左边界,如果当前字符在t中,并且lent==0,表示为当前满足题意左边界最大值,判断当前窗口和要窗口大小,谁小取谁,并且频率数组+1,表示左边界开始移动,目标窗口内得字符个数减少
20 if(s[left] in t):
21 if(minright-minleft>right-left and lent==0):
22 minright=right
23 minleft=left
24 flage[s[left]]+=1
25 #当字符频率大于0时,表示当前窗口缺少这个字符,要找得字符长度+1
26 if(flage[s[left]]>0): lent+=1
27 left+=1
28 #要找得字符个数大于0,结束循环
29 if(lent>0): break
30 #右边界为s长度,表示没有合适得长度
31 if(minright==lens): return ""
32 return s[minleft:minright+1]
minWindow
Leetcode刷题第三天-贪心-双指针的更多相关文章
- leetcode刷题(三)
1.图论 找到小镇的法官 在一个小镇里,按从 1 到 N 标记了 N 个人.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相信任何人.每个人(除了小镇法官外) ...
- leetcode刷题第三天<无重复字符的最长子串>
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 : 输入: "abcabcbb" 输出: 解释: 因为无重复字符的最长子串是 . 示例 : 输入: &quo ...
- C#LeetCode刷题-双指针
双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.5% 中等 11 盛最多水的容器 43.5% 中等 15 三数之和 16.1% 中等 16 最接近的三数之和 3 ...
- C#LeetCode刷题-贪心算法
贪心算法篇 # 题名 刷题 通过率 难度 44 通配符匹配 17.8% 困难 45 跳跃游戏 II 25.5% 困难 55 跳跃游戏 30.6% 中等 122 买卖股票的最佳时机 II C ...
- 看完互联网大佬的「LeetCode 刷题手册」, 手撕了 400 道 Leetcode 算法题
大家好,我是 程序员小熊 ,来自 大厂 的程序猿.相信绝大部分程序猿都有一个进大厂的梦想,但相较于以前,目前大厂的面试,只要是研发相关岗位,算法题基本少不了,所以现在很多人都会去刷 Leetcode ...
- LeetCode刷题总结之双指针法
Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...
- LeetCode刷题总结-数组篇(上)
数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...
- LeetCode刷题总结-数组篇(下)
本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...
- LeetCode刷题的一点个人建议和心得
目录 1. 为什么我们要刷LeetCode? 2. LeetCode的现状和问题 3. 本文的初衷 4. LeetCode刷题建议 4.1入门数据结构,打基础阶段 4.2 建立 ...
- LeetCode刷题模板(1):《我要打10个》之二分法
Author : 叨陪鲤 Email : vip_13031075266@163.com Date : 2021.01.23 Copyright : 未 ...
随机推荐
- 题解 [HDU6746] Civilization(贪心+模拟)
来源:2020 年百度之星·程序设计大赛 - 初赛一 一道贪心 + 细节模拟题 题意很简单,这里不详细写了 观察题目,\(n\) 只有 500 ,可以 \(n \times n\) 枚举每个位置作为起 ...
- StringBuilder 线程不安全,到底哪里不安全?
StringBuilder 线程不安全,到底哪里不安全? 在Java中,字符串拼接是一个非常常见的操作,而对于频繁变动的字符串内容,使用StringBuilder是一个性能优化的选择.但是,Strin ...
- <vue 基础知识 8、购物车样例>
代码结构 一. 效果 1. 展示列表v-for 2. 购买数量增加减少,使用@click触发回调函数. 减少的时候如果已经为1了就不让继续减少,使用了v-bind绑定属性 3. 移除也是使用@ ...
- C#设计模式18——迭代器模式的写法
是什么: 迭代器模式是一种行为型设计模式,它允许客户端通过一种统一的方式遍历集合对象中的元素,而无需暴露集合对象的内部结构. 为什么: 使用迭代器模式可以使得客户端程序与集合对象解耦,从而可以更加灵活 ...
- C# 序列化器
理论知识: 序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存.数据库或文件的过程. 它的主要用途是保存对象的状态,以便能够在需要时重新创建对象. 反向过程称为"反序列化" ...
- IDEA控制台输出中文乱码
1.问题 如下图,我使用的文件编码格式为UFT-8,这里会出现中文乱码的问题. 且我并不方便直接修改全局文件编码格式,有可能会造成未知错误. 2.解决 参考链接:IDEA 控制台中文乱码 4 种解决方 ...
- Oracle建立索引前后性能比较
1.SQL语句 create table C##HR.t_noindex as select * from all_objects; create table C##HR.t_indexed as s ...
- CSS 3D - rotate旋转90度看不到的原理 和 解决方法
原理: 旋转元素的坐标有三个 :X(向右), Y(向左) , Z(向电脑屏幕的你) 当没有位移旋转元素时,元素 Z 坐标也会同着一起旋转 ,当一个物品旋转到90度时,我们只能看到它的厚度,而d ...
- CSS : 使用 z-index 的前提
使用 z-index 前 , 需要将元素 定位设置为 position : relative .
- [转帖]nginx 剖析 request_time和upstream_response_time的误区、区别
https://cloud.tencent.com/developer/article/1767981 首先,澄清一个误区 upstream_response_time必须在upstream配置时才能 ...