【随想录】Day36—第八章 贪心算法 part05

embedded/2024/10/19 15:39:21/

目录

  • 题目1: 无重叠区间
    • 1- 思路
    • 2- 题解
      • ⭐ 无重叠区间——题解思路
  • 题目2: 763. 划分字母区间
    • 1- 思路
    • 2- 题解
      • ⭐ 划分字母区间——题解思路
  • 题目3: 56. 合并区间
    • 1- 思路
    • 2- 题解
      • ⭐ 合并区间——题解思路


题目1: 无重叠区间

  • 题目链接:435. 无重叠区间

1- 思路

贪心思路
贪心思路类似于,最少的弓箭射气球的场景

  • 通过遍历的方式,遍历区间
    1. 先根据区间的左侧值对区间进行排序
    1. 遍历区间
    • **重叠 **:如果当前遍历的区间与前一个区间重叠,此时修改 当前区间的右侧范围 为二者最小值
    • 不重叠:如果此时不重叠,对 res 结果进行 ++。

实际上这个与弓箭射气球所求的结果是相反的,弓箭射气球实际上求的是无重叠区间个数,因此本题目根据弓箭射气球的结果 使用 intervals 的长度减去 无重叠区间个数所得到的就是所求结果:即重叠区间个数。


2- 题解

⭐ 无重叠区间——题解思路

在这里插入图片描述

class Solution {public int eraseOverlapIntervals(int[][] intervals) {int res = 1;Arrays.sort(intervals,(o1,o2) -> Integer.compare(o1[0],o2[0]));for(int i = 1 ; i < intervals.length;i++){// 重叠if(intervals[i][0] < intervals[i-1][1]){intervals[i][1] = Math.min(intervals[i-1][1],intervals[i][1]);}else{res++;}}return intervals.length - res;}
}

题目2: 763. 划分字母区间

  • 题目链接:763. 划分字母区间

1- 思路

疑问

  • 如何定义一个状态来判断当前字母是否出现过?——> 哈希结构
    • 利用一个数据结构存储字符出现的最远下标位置
  • 如何保证当前状态的字母尽可能维持更长?
    • 利用最远下标位置遍历,遍历的过程保证该集合中的下标的最远遍历位置不超过当前字母的最远遍历位置

贪心思路

  • ① 记录每个元素的最远出现位置
    • 定义 int[] hash = new int[26] 哈希数组,从前向后遍历数组,将 hash 数组的值赋值为下标 i。
  • ② 遍历字符串,寻找分割点
    • 数据结构:定义 List<Integer> 收集结果
    • 数据结构:定义 leftright 为左右区间指针
    • 右边界取遍历的最大值,如果 **i== right** 证明收集到一个结果,此时收集结果

2- 题解

⭐ 划分字母区间——题解思路

在这里插入图片描述

class Solution {List<Integer> res = new ArrayList<>();public List<Integer> partitionLabels(String s) {// 遍历 S 初始化 下标数组int[] hash = new int[26];for(int i = 0 ; i < s.length();i++){hash[s.charAt(i)-'a'] = i;}int left = 0;int right = 0;for(int i =0  ; i < s.length();i++){// 遍历right = Math.max(right,hash[s.charAt(i)-'a']);// 结果if(right==i){res.add(right-left+1);left = right+1;}}return res;}
}

题目3: 56. 合并区间

  • 题目链接:56. 合并区间

1- 思路

疑问 && 难点

  • 如何记录合并后的区间? ——> 定义

贪心思路
类似于:弓箭引爆气球

    1. 对输入的区间根据左侧进行排序
    1. 遍历排序区间
    • 若重叠:此时更新 right 为最大值
    • 若不重叠:收集结果,更新 leftright

2- 题解

⭐ 合并区间——题解思路

在这里插入图片描述

class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals,(o1,o2) -> Integer.compare(o1[0],o2[0]));List<int[]> res = new ArrayList<>();int left = intervals[0][0];int right = intervals[0][1];for(int i = 1;i < intervals.length;i++){// 不重叠,收集结果if(intervals[i][0] > right){res.add(new int[]{left,right});left = intervals[i][0];right = intervals[i][1];}else{ //重叠:更新最大右边界        right = Math.max(right, intervals[i][1]);}}res.add(new int[]{left,right});return res.toArray(new int[res.size()][]);}
}


http://www.ppmy.cn/embedded/28543.html

相关文章

Linux CPU 飙升 排查五步法

排查思路-五步法 1. top命令定位应用进程pid 找到最耗时的CPU的进程pid top2. top-Hp[pid]定位应用进程对应的线程tid 找到最消耗CPU的线程ID // 执行 top -Hp [pid] 定位应用进程对应的线程 tid // 按shift p 组合键&#xff0c;按照CPU占用率排序 > top -Hp 111683.…

用FPGA+DAC输出“心”形波

1.前言 之前在做信号处理的时候整了一下活&#xff0c;用FPGADAC&#xff08;数模转换器&#xff09;&#xff0c;输出了一个爱心形状的波形&#xff0c;今天整理资料的时候偶然发现了他&#xff0c;现在把他分享出来。当时将DAC的输出接在示波器上显示如下图所示&#xff1a; …

【Spring AI】02. 嵌入向量 API

文章目录 嵌入向量 APIAPI 概述EmbeddingClientEmbeddingRequestEmbeddingResponseEmbedding 可用实现 嵌入向量 API EmbeddingClient 接口旨在与人工智能和机器学习中的嵌入向量模型进行直接集成。其主要功能是将文本转换为数字向量&#xff0c;通常称为嵌入向量。这些嵌入向…

抖音视频怎么无水印下载(方法)

在这个数字化时代&#xff0c;抖音已经成为了人们生活中不可或缺的一部分。每天&#xff0c;数以亿计的用户在这个平台上分享着各种各样的视频&#xff0c;让人们笑&#xff0c;让人们感动&#xff0c;让人们沉迷。你是否曾经遇到过想要保存一段精彩的抖音视频却苦于无法去掉水…

GZIPOutputStream JSON压缩

一、背景 小王瞥了一眼历史记录表&#xff0c;不禁惊呼&#xff1a;“这表怎么这么大&#xff1f;”同事们闻声纷纷围拢过来查看。仔细一瞧&#xff0c;发现这个表的大小竟然超过了3G。主管随即指示小王打开相应的表数据检查&#xff0c;发现其中存储了用户的权限信息&#xf…

GPT每日面试题—csrf攻击的原理和解决方案

充分利用ChatGPT的优势&#xff0c;帮助我们快速准备前端面试。今日问题&#xff1a;csrf原理和解决方案? Q&#xff1a;如果在前端面试中&#xff0c;被问到csrf原理和解决方案&#xff0c;怎么回答比较好&#xff0c;全面具体的描述一下 A&#xff1a;在前端面试中&#xf…

STM32(c语言基础)

1.硬件部分&#xff1a;按键&#xff0c;传感器 传感器模块&#xff1a;光敏电阻&#xff0c;热敏电阻&#xff0c;红外接收管 光敏电阻&#xff1a;光线越强&#xff0c;光敏电阻的阻值就越小&#xff1b; 热敏电阻&#xff1a;温度越高&#xff0c;热敏电阻的阻值越小&…

每日OJ题_DFS爆搜深搜回溯剪枝②_力扣526. 优美的排列

目录 力扣526. 优美的排列 解析代码 力扣526. 优美的排列 526. 优美的排列 难度 中等 假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm&#xff08;下标从 1 开始&#xff09;&#xff0c;只要满足下述条件 之一 &#xff0c;该数组就是一个 优美的排列 &#…