leetcode每天5题-Day54(贪心3)
admin
2024-01-25 08:15:44
0

目录

  • 1. 用最少数量的箭引爆气球
  • 2. 无重叠区间
  • 3. 划分字母区间
  • 4. 合并区间
  • 5. 单调递增的数字
  • 6. 买卖股票的最佳时机含手续费
  • 7. 监控二叉树

1. 用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球-中等

局部最优:当气球重叠时,一起射,所用弓箭最少。
对数组排序,如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。

var findMinArrowShots = function(points) {points.sort((a, b) => a[0] - b[0]);let ans = 1;for(let i = 1; i < points.length; i++) {if(points[i][0] > points[i - 1][1]) {ans++;}else{points[i][1] = Math.min(points[i][1], points[i - 1][1]);}}return ans;
};

总结:感觉这道题,虽然有了点思路,但不知道从何下手。发现代码其实很简洁,当points[i]points[i - 1]无交集时,弓箭数直接加一,否则更新points[i]右端点的值。

2. 无重叠区间

435. 无重叠区间-中等

思路:知道这道题要排序,但不清楚具体应该怎么排序,排完序之后进行什么操作?

  • 按照右边界排序,就要从左向右遍历,因为右边界越小越好,只要右边界越小,留给下一个区间的空间就越大,所以从左向右遍历,优先选右边界小的。
  • 按照左边界排序,就要从右向左遍历,因为左边界数值越大越好(越靠右),这样就给前一个区间的空间就越大,所以可以从右向左遍历。

以下解法采用,按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。
局部最优:按右边界排序后,优先选右边界小的区间,所以从左向右遍历,留给下一个区间的空间大一些,从而尽量避免交叉。全局最优:选取最多的非交叉区间。

重点:直接求重叠区间,是很复杂的。把问题转换成求最大非重复区间个数,求个数时,用分割点做标记。

按右边界排序

var eraseOverlapIntervals = function(intervals) {// 按右边界排序intervals.sort((a, b) => a[1] - b[1]);let ans = 1;let end = intervals[0][1];for(let i = 1; i < intervals.length; i++) {if(intervals[i][0] >= end) {end = intervals[i][1];ans += 1;}}return intervals.length - ans;
};

按左边界排序

var eraseOverlapIntervals = function(intervals) {// 按照左边界升序排列intervals.sort((a, b) => a[0] - b[0])let count = 1let end = intervals[intervals.length - 1][0]// 倒序遍历,对单个区间来说,左边界越大越好,因为给前面区间的空间越大for(let i = intervals.length - 2; i >= 0; i--) {if(intervals[i][1] <= end) {count++end = intervals[i][0]}}// count 记录的是最大非重复区间的个数return intervals.length - count
}

3. 划分字母区间

763. 划分字母区间-中等

思路:

  1. 统计每个字符最后出现的位置
  2. 从前向后遍历字符串,更新字符的最远出现下标。如果找到字符最远出现位置下标与当前下标相等,就说明找到了分割点
var partitionLabels = function(s) {let hash = {};//  统计每个字符出现的最远位置for(let i = 0; i < s.length; i++) {hash[s[i]] = i;}let ans = [];let l = 0, r = 0;for(let i = 0; i < s.length; i++) {r = Math.max(r, hash[s[i]]);if(r === i) {ans.push(r - l + 1);l = i + 1;}}return ans;
};

4. 合并区间

56. 合并区间-中等

重点:新建一个数组,然后不断更新这个数组中区间段的右端点。

var merge = function(intervals) {// 按区间的左端点排序intervals.sort((a,b)=>a[0]-b[0]);const ans=[];for(let i=0;ilet l=intervals[i][0],r=intervals[i][1];//  区间段中的区间左端点大于ans中右端点if(ans.length==0||l>ans[ans.length-1][1]){ans.push([l,r]);}else{// 更新ans中右端点的值ans[ans.length-1][1]=Math.max(ans[ans.length-1][1],r);}}return ans;
};

5. 单调递增的数字

738. 单调递增的数字-中等

思路:遇到strNum[i - 1] > strNum[i]时,让strNum[i - 1]--strNum[i]为9。

重点:要从后向前遍历,因为如果从前向后遍历,strNum[i - 1]--后可能会小于strNum[i - 2]。此外,还需要一个flag标记从哪里开始赋值为9的,然后需要把flag之后位的都赋值为9。

var monotoneIncreasingDigits = function(n) {n = n.toString();//  转成数组n = n.split('').map(item => {return +item;})let flag = Infinity;for(let i = n.length - 1; i > 0; i--) {if(n[i - 1] > n[i]) {flag = i;n[i - 1]--;}}for(let i = flag; i < n.length; i++) {n[i] = 9;}return n.join('');
};

6. 买卖股票的最佳时机含手续费

714. 买卖股票的最佳时机含手续费-中等
贪心

var maxProfit = function(prices, fee) {let ans = 0;let minPrice = prices[0];for(let i = 0; i < prices.length; i++) {if(prices[i] < minPrice) {minPrice = prices[i];}if(prices[i] >= minPrice && prices[i] <= minPrice + fee) continue;if(prices[i] > minPrice + fee) {ans += prices[i] - minPrice -fee;minPrice = prices[i] - fee;  // 买入和卖出只需要支付一次手续费}}return ans;
};

动态规划

7. 监控二叉树

968. 监控二叉树-困难

重点:从下往上看,局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!

0:该节点无覆盖
1:本节点有摄像头
2:本节点有覆盖

var minCameraCover = function(root) {let ans = 0;function traversal(cur) {if(cur === null) return 2;let l = traversal(cur.left);let r = traversal(cur.right);if(l === 2 && r === 2) return 0;if(l === 0 || r === 0) {ans++;return 1;}if(l === 1 || r === 1) return 2;return -1;}if(traversal(root) === 0) ans++;return ans;
};

相关内容

热门资讯

安卓系统43适配软件,软件升级... 你有没有发现,你的安卓手机最近是不是有点儿“水土不服”?别急,别急,让我来给你揭秘为什么你的安卓系统...
安卓系统有车载系统吗吗,智能驾... 你有没有想过,当你坐在车里,享受着旅途的悠闲时光,手机上的安卓系统是不是也能派上用场呢?没错,我就要...
安卓8.1系统解锁方法,畅享自... 你有没有想过,你的安卓手机里隐藏着无数的小秘密?比如,解锁安卓8.1系统,就能让你的手机焕发出全新的...
安卓系统怎么打开邮件,安卓系统... 你有没有想过,每天那么多邮件,怎么才能快速打开它们呢?尤其是当你用的是安卓系统手机的时候。别急,今天...
封闭安卓系统安装软件,一步到位... 你有没有想过,为什么你的安卓手机里有些软件只能通过官方渠道安装呢?今天,就让我带你一探究竟,揭开封闭...
小米mipad升级安卓系统,解... 你有没有发现,最近小米Mipad的安卓系统升级可是个大热门呢!这不,我就迫不及待地来和你聊聊这个话题...
哪个安卓系统体验好,揭秘安卓系... 你有没有想过,手机里的安卓系统就像是个大厨,不同的版本就是不同的拿手好菜,有的让你回味无穷,有的却让...
安卓系统开发测试,全方位技术解... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,是怎么从无到有,一步步成长起来的呢?今天...
安卓系统怎么查配置,轻松掌握设... 你有没有想过,你的安卓手机里藏着多少秘密?别小看这些配置信息,它们可是了解你手机性能的“小侦探”呢!...
pve下安装安卓系统,PVE环... 你有没有想过,在你的PVE服务器上安装一个安卓系统呢?听起来是不是有点酷炫?想象你的服务器不仅能够运...
安卓手机安装虹膜系统,安卓手机... 你有没有想过,你的安卓手机还能这样玩?没错,就是安装虹膜系统!听起来是不是有点酷炫?别急,让我带你一...
小米论坛原生安卓系统,深度解析... 你有没有想过,你的手机系统其实可以更加纯粹、更加原生?今天,就让我带你走进小米论坛,一探究竟,看看那...
安卓怎么装iphone系统,轻... 你是不是也和我一样,对安卓手机上的iPhone系统充满了好奇?想象那流畅的界面、强大的性能,还有那独...
模拟器系统安卓,打造移动应用开... 你有没有想过,在手机上也能体验到电脑游戏的快感?没错,这就是安卓模拟器系统的魅力所在!今天,就让我带...
安卓系统清理系统更新包,提升运... 手机里的安卓系统是不是越来越慢了?别急,今天就来给你支个招,让你的安卓手机焕然一新!那就是——清理系...
酷开系统是安卓系统不,深度解析... 亲爱的读者,你是否曾好奇过,那些在我们手机、电视上运行得风生水起的操作系统,它们之间究竟有何不同?今...
小说系统类游戏安卓,安卓世界逆... 你有没有想过,在手机上玩一款能让你瞬间穿越到小说世界的游戏?想象你不再是旁观者,而是故事的主角,那种...
安卓系统网页上传文件,安卓系统... 你有没有遇到过这种情况:手机里存了好多文件,想要上传到网页上分享,却发现安卓系统的操作有点儿复杂?别...
xp系统能刷安卓系统吗,体验全... 你有没有想过,你的老XP系统是不是也能玩转安卓的乐趣呢?没错,今天就来聊聊这个话题,看看XP系统能不...
安卓系统图标修改方法,让你的手... 你有没有发现,手机里的安卓系统图标总是那么单调乏味?是不是也想给它们换上新鲜的衣服,让手机界面焕然一...