D3132|贪心算法

435.无重叠区间

初始思路:

        我的思路就是如果有两个区间重叠,保留end比较小的那个区间,删除end比较大的区间。

class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0]-o2[0];}});int result = 0;int start = intervals[0][0];int end = intervals[0][1];for(int i = 1;i<intervals.length;i++){System.out.println("start"+start);System.out.println("end"+end);if(intervals[i][0]<end){result++;if(intervals[i][1]<end){end = intervals[i][1];start = intervals[i][0];}}else{start = intervals[i][0];end = intervals[i][1];}}return result;}
}

题解复盘:

        跟题解中按照左边排序的思路基本一致。


763.划分字母区间

初始思路:

以本题举例,首先是一个二维数组,统计每个字母的start和结束。

a的区间是0~8,b的区间是1~5,c的区间是4~7,d的区间是9~14,e的区间是10~15,j的区间是11,11,h的区间是16~18,i的区间是17~22,j的区间是18~23.然后类似的合并区间,

class Solution {public List<Integer> partitionLabels(String s) {List<Integer> result = new ArrayList<>();int[][] temp =  new int[26][2];for(int i = 0;i<s.length();i++){int a = s.charAt(i)-'a';if(temp[a][0]!=0){temp[a][1]=i;}else{temp[a][0] = i;temp[a][1] = i;}}int start = 0;int end = 0;Arrays.sort(temp, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0]-o2[0];}});for (int[] ints : temp) {if(ints[1]!=0){end = ints[1];break;}}for(int i = 0;i<temp.length;i++){if(temp[i][1]!=0){System.out.println(Arrays.toString(temp[i]));if(start<=temp[i][0]&&temp[i][0]<=end){end = Math.max(end,temp[i][1]);}else{System.out.println("start"+start);System.out.println("end"+end);result.add(end-start+1);start = temp[i][0];end = temp[i][1];}}}result.add(end-start+1);return result;}
}

可以应对大多数情况,但是无法ac,对于第一个字母的处理有点奇怪。

题解复盘:

题解思路更加简洁,只关注最远的结束位置,不关注起始点。

可以分为如下两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

如图:

763.划分字母区间

class Solution {public List<Integer> partitionLabels(String S) {List<Integer> list = new LinkedList<>();int[] edge = new int[26];char[] chars = S.toCharArray();for (int i = 0; i < chars.length; i++) {edge[chars[i] - 'a'] = i;}int idx = 0;int last = -1;for (int i = 0; i < chars.length; i++) {idx = Math.max(idx,edge[chars[i] - 'a']);if (i == idx) {list.add(i - last);last = i;}}return list;}
}

 


56.合并区间

初始思路:

        首先对二维数组进行排序,如果目前的左边界小于前一个的右边界则代表两个区间有重叠,那么更新区间的左边界为两个左边界之中最小的,更新右边界为两个右边界之中最大的。这可能涉及到会有三个区间重叠的情况,所以第三个区间需要和已经更新新边界的前两个区间的最终结果进行比较,从而得到新的区间,再存入的result集中。

class Solution {public int[][] merge(int[][] intervals) {if(intervals.length==1){return intervals;}Arrays.sort(intervals, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0]-o2[0];}});ArrayList<int[]> al = new ArrayList<>();al.add(intervals[0]);for (int i = 1; i <intervals.length ; i = i+1) {int[] temp = al.get(al.size()-1);int a = temp[0];int b = temp[1];if(b>=intervals[i][0]){al.remove(al.size()-1);temp[0] = Math.min(a,intervals[i][0]);temp[1] = Math.max(b,intervals[i][1]);al.add(temp);}else{al.add(intervals[i]);}}return al.toArray(new int[al.size()][]);}
}

题解复盘:

        跟题解中版本2的思路雷同。


738.单调递增的数字

示例 1:

输入: n = 10
输出: 9

示例 2:

输入: n = 1234
输出: 1234

示例 3:

输入: n = 332
输出: 299

初始思路:

        大概的思路就是,首先我们需要获取每一位的数字,然后进行比较,判断当前是否为单调递增的数字,如果是直接返回当前结果,如果不是,当前数字减1重复以上步骤。但是有点不太好写。

题解复盘:

1.如何变:

98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。

2.从前向后还是从后向前:

从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。

这么说有点抽象,举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。

那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299

class Solution {public int monotoneIncreasingDigits(int n) {String s = String.valueOf(n);char[] chars = s.toCharArray();int start = s.length();for (int i = s.length() - 2; i >= 0; i--) {if (chars[i] > chars[i + 1]) {chars[i]--;start = i+1;}}for (int i = start; i < s.length(); i++) {chars[i] = '9';}return Integer.parseInt(String.valueOf(chars));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283514.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7安装Docker及添加阿里云镜像加速详细教程

Docker官方安装教程网站&#xff1a;Install Docker Engine on CentOS | Docker Docs 具体流程如下&#xff1a; 1.确定你是CentOS7及以上版本 cat /etc/redhat-release 2.yum安装gcc相关 yum -y install gcc yum -y install gcc-c 3.安装需要的软件包 3.1安装docker引擎…

力扣刷题-二叉树-找树左下角的值

513 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1&#xff1a; 示例 2&#xff1a; 思路 层序遍历 直接层序遍历&#xff0c;因为题目说了是最底层&#xff0c;最左边的值&a…

配置策略路由(基于IP地址)示例

策略路由简介 定义 策略路由PBR&#xff08;Policy-Based Routing&#xff09;是一种依据用户制定的策略进行路由选择的机制&#xff0c;其优先级高于直连路由、静态路由和通过动态路由协议生成的路由。设备配置策略路由后&#xff0c;若接收的报文&#xff08;包括二层报文&…

LCR 146. 螺旋遍历二维数组

解题思路&#xff1a; class Solution {public int[] spiralArray(int[][] array) {if(array.length 0) return new int[0];int l 0, r array[0].length - 1;int t 0, b array.length - 1;int x 0;int[] res new int[(r 1) * (b 1)];while(true) {for(int i l; i <…

geemap学习笔记028:Landsat8计算时间序列NDVI并导出

前言 本节则是以Landsat8影像数据为例&#xff0c;进行NDVI时间序列计算&#xff0c;并将得到的时间序列NDVI进行展示并导出。 1 导入库并显示地图 import ee import geemap import datetime import pandas as pd import os ee.Initialize()2 定义时间范围 # 定义日期范围 …

c语言:判断是否为整数|练习题

一、题目 输入一个数字&#xff0c;判断该数字是否为整数 如图&#xff1a; 二、思路分析 1、没有小数部分的数字&#xff0c;即为整数。所以&#xff0c;只要知道该数字是否有小数部分&#xff0c;即可。 2、例子&#xff1a;1.5减去10.5&#xff0c;由于有小数部分&#xff0…

GEE(ccdc-1)——利用Landsat系列影像获取研究区范围的多波段影像(包含ccdc中已经定义的多波段)

简介 在进行CCDC监测时,我们首先要做的就是获取研究区的长时间序列影像,让其保存在你的资产中,方便后面调用,这里我们要做的额就是根据代码,将我们时间范围进行选取和指定的研究区边界,剩下的采用默认参数即可。最后出现的结果是将ccdc代码中所需要的波段和影像中一些光…

mysql innodb知识记录

官方文档 官网架构图 innodb 特性 内存 buffer pool 采用优化后的LRU算法&#xff0c; 3/8 of the buffer pool is devoted to the old sublist.The midpoint of the list is the boundary where the tail of the new sublist meets the head of the old sublist.When In…

ensp创建配置环境,实现全网互访

文章目录 创建配置环境&#xff0c;实现全网互访配置步骤接入层交换机&#xff08;sw4、sw5&#xff09;划分vlan汇聚层交换机&#xff08;sw2、sw3&#xff09;配置ip地址作为vlan网关、与sw1 ip地址直连核心层交换机&#xff08;sw1&#xff09;配置ip地址与汇聚层交换机&…

容器技术:从虚拟机到轻量级容器的革命

一、引言 首先&#xff0c;什么是容器&#xff1f; 容器是一种沙盒技术&#xff0c;主要目的是为了将应用运行在其中&#xff0c;与外界隔离&#xff1b;及方便这个沙盒可以被转移到其它宿主机器。本质上&#xff0c;它是一个特殊的进程。通过名称空间&#xff08;Namespace&a…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《计及调频能力和经济效益的储能集群多状态区间优化策略》

这个标题提到了三个关键概念&#xff1a;储能集群、调频能力和经济效益&#xff0c;以及多状态区间优化策略。下面我将为你解释每个概念的含义&#xff0c;并对整个标题进行解读。 首先&#xff0c;"储能集群"是指将多个储能系统连接在一起形成一个集群&#xff0c;…

【算法】bfs与dfs算法解决FloodFill(洪流)问题(C++)

文章目录 1. 什么是FloodFill问题2. 用什么方法解决FloodFill问题3. 具体例题773.图像渲染200.岛屿数量695.岛屿的最大面积130.被围绕的区域 1. 什么是FloodFill问题 一般floodfill问题可以描述为&#xff1a;给定一个二维矩阵&#xff0c;其中每个元素代表一个像素点&#xf…