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

相关内容

热门资讯

自己制作安卓系统教程,自制安卓... 亲爱的读者们,你是否曾梦想过摆脱安卓系统的束缚,亲手打造一个只属于你自己的操作系统?别再羡慕那些技术...
安卓系统调整器下载,轻松优化手... 你有没有发现,手机用久了,系统总是有点小问题,比如卡顿啦,电池续航不给力啦,这些小烦恼是不是让你头疼...
怎样升级安卓系统视频,安卓系统... 亲爱的手机控们,你是否也和我一样,对手机系统升级充满了好奇和期待?想象你的安卓手机在经过一番“变身”...
鸿蒙系统和安卓系统哪个广告少,... 你有没有发现,现在手机市场上的操作系统真是五花八门,让人挑花了眼。不过,最近有个话题特别火,那就是鸿...
安卓系统openrec怎么注册... 你有没有想过,想要在安卓系统上体验一把OpenRec的乐趣,却发现注册步骤有点让人摸不着头脑?别急,...
怎样更新车机安卓系统,车机安卓... 亲爱的车主朋友们,你是不是也和我一样,对车机系统里的安卓系统充满了好奇?想要让它焕然一新,变得更加强...
安卓机换系统后照片,照片如何完... 你有没有遇到过这种情况:手机里的照片突然消失得无影无踪,心里那个急啊,就像热锅上的蚂蚁。别担心,今天...
安卓手机定位系统软件,技术原理... 你有没有想过,你的安卓手机里那些神奇的定位系统软件是怎么工作的呢?它们就像你的私人侦探,随时随地告诉...
安卓制作win系统盘,打造Wi... 亲爱的读者,你是否曾想过,将安卓系统的魅力与Windows系统的强大功能完美结合?今天,就让我带你一...
系统警告_您的安卓手机,揭秘潜... 亲爱的手机主人,最近你的安卓手机是不是突然跳出来一个系统警告,让你心头一紧?别慌,今天就来给你详细解...
投屏安卓系统版本,揭秘不同版本... 你有没有想过,家里的电视屏幕那么大,却只能用它来看电视?现在,有了安卓系统,你就可以把手机上的精彩内...
安卓官方系统升级软件,畅享智能... 你有没有发现,你的安卓手机最近是不是变得有点儿“年轻”了?没错,这就是安卓官方系统升级的魅力所在!今...
安卓系统铃声长度是多少,时长差... 你有没有想过,为什么你的手机每次收到消息时,都会响起那熟悉的铃声?是不是好奇过,安卓系统的铃声长度到...
酷派电脑系统安卓,深度解析与全... 亲爱的读者们,你是否曾对那些在电脑世界里游刃有余的酷派电脑系统安卓版心生好奇?今天,就让我带你一起揭...
什么系统可以装安卓软件,基于A... 你有没有想过,你的手机里那些好玩又实用的安卓软件,其实也可以在其他设备上运行呢?没错,这就是今天我们...
制作安卓系统主题软件,安卓系统... 你有没有想过,给你的安卓手机换一个全新的面貌?没错,就是那种一打开手机,就能感受到完全不同的风格和氛...
安卓系统平板怎么截屏,操作指南... 亲爱的平板用户,你是不是也和我一样,有时候想记录下平板上的精彩瞬间,却发现截屏功能有点神秘?别担心,...
安卓系统不推送更新,揭秘背后的... 最近是不是发现你的安卓手机有点儿“懒”啊?更新推送总是慢吞吞的,让人等得花儿都谢了。别急,今天就来给...
ape格式转换安卓系统,享受音... 你有没有想过,你的安卓手机里的ape格式音乐文件,竟然可以通过一个小小的转换,焕发出全新的生命力?没...
获取安卓系统加载器,核心功能与... 你有没有想过,你的安卓手机里那些神奇的软件和游戏是怎么被安装到你的设备上的呢?没错,就是通过一个叫做...