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;
};

相关内容

热门资讯

电视安卓系统哪个品牌好,哪家品... 你有没有想过,家里的电视是不是该升级换代了呢?现在市面上电视品牌琳琅满目,各种操作系统也是让人眼花缭...
安卓会员管理系统怎么用,提升服... 你有没有想过,手机里那些你爱不释手的APP,背后其实有个强大的会员管理系统在默默支持呢?没错,就是那...
安卓系统软件使用技巧,解锁软件... 你有没有发现,用安卓手机的时候,总有一些小技巧能让你玩得更溜?别小看了这些小细节,它们可是能让你的手...
安卓系统提示音替换 你知道吗?手机里那个时不时响起的提示音,有时候真的能让人心情大好,有时候又让人抓狂不已。今天,就让我...
安卓开机不了系统更新 手机突然开不了机,系统更新还卡在那里,这可真是让人头疼的问题啊!你是不是也遇到了这种情况?别急,今天...
安卓系统中微信视频,安卓系统下... 你有没有发现,现在用手机聊天,视频通话简直成了标配!尤其是咱们安卓系统的小伙伴们,微信视频功能更是用...
安卓系统是服务器,服务器端的智... 你知道吗?在科技的世界里,安卓系统可是个超级明星呢!它不仅仅是个手机操作系统,竟然还能成为服务器的得...
pc电脑安卓系统下载软件,轻松... 你有没有想过,你的PC电脑上安装了安卓系统,是不是瞬间觉得世界都大不一样了呢?没错,就是那种“一机在...
电影院购票系统安卓,便捷观影新... 你有没有想过,在繁忙的生活中,一部好电影就像是一剂强心针,能瞬间让你放松心情?而我今天要和你分享的,...
安卓系统可以写程序? 你有没有想过,安卓系统竟然也能写程序呢?没错,你没听错!这个我们日常使用的智能手机操作系统,竟然有着...
安卓系统架构书籍推荐,权威书籍... 你有没有想过,想要深入了解安卓系统架构,却不知道从何下手?别急,今天我就要给你推荐几本超级实用的书籍...
安卓系统看到的炸弹,技术解析与... 安卓系统看到的炸弹——揭秘手机中的隐形威胁在数字化时代,智能手机已经成为我们生活中不可或缺的一部分。...
鸿蒙系统有安卓文件,畅享多平台... 你知道吗?最近在科技圈里,有个大新闻可是闹得沸沸扬扬的,那就是鸿蒙系统竟然有了安卓文件!是不是觉得有...
宝马安卓车机系统切换,驾驭未来... 你有没有发现,现在的汽车越来越智能了?尤其是那些豪华品牌,比如宝马,它们的内饰里那个大屏幕,简直就像...
p30退回安卓系统 你有没有听说最近P30的用户们都在忙活一件大事?没错,就是他们的手机要退回安卓系统啦!这可不是一个简...
oppoa57安卓原生系统,原... 你有没有发现,最近OPPO A57这款手机在安卓原生系统上的表现真是让人眼前一亮呢?今天,就让我带你...
安卓系统输入法联想,安卓系统输... 你有没有发现,手机上的输入法真的是个神奇的小助手呢?尤其是安卓系统的输入法,简直就是智能生活的点睛之...
怎么进入安卓刷机系统,安卓刷机... 亲爱的手机控们,你是否曾对安卓手机的刷机系统充满好奇?想要解锁手机潜能,体验全新的系统魅力?别急,今...
安卓系统程序有病毒 你知道吗?在这个数字化时代,手机已经成了我们生活中不可或缺的好伙伴。但是,你知道吗?即使是安卓系统,...
奥迪中控安卓系统下载,畅享智能... 你有没有发现,现在汽车的中控系统越来越智能了?尤其是奥迪这种豪华品牌,他们的中控系统简直就是科技与艺...