带你读《图解算法小抄》二十二、贪心算法(7)

简介: 带你读《图解算法小抄》二十二、贪心算法(7)

带你读《图解算法小抄》二十二、贪心算法(6)https://developer.aliyun.com/article/1347847?groupCode=tech_library


9.划分字母区间

1)题目描述

给定一个字符串 S,将字符串划分为尽可能多的片段,使得每个字母最多出现在一个片段中。返回每个片段的长度列表。

2)解题步骤

为了解决划分字母区间的问题,我们可以使用贪心算法来解决。贪心算法的思路是尽量选择包含较大字母范围的片段,以确保每个字母只出现在一个片段中。

 

 

 

我们按照以下步骤进行解题:

 

  • 创建一个字母表 lastIndex 来存储每个字母最后出现的索引。
  • 遍历字符串 S,对于每个字母 S[i],更新字母在 lastIndex 中的索引为 i。
  • 初始化变量 start 和 end,表示当前片段的起始位置和结束位置,初始值均为 0。
  • 遍历字符串 S,对于每个字母 S[i]:
  • 更新当前片段的结束位置 end 为 Math.max(end, lastIndex[S[i]]),确保当前片段包含了所有之前出现的字母。
  • 如果当前位置 i 等于当前片段的结束位置 end,说明当前片段中的所有字母都在该片段中且没有出现在其他片段中,此时可以将当前片段加入结果列表,并更新下一个片段的起始位置 start 为 end + 1。

 

  • 返回结果列表,即每个片段的长度。

以下是使用贪心算法解决划分字母区间问题的算法框架:

 

function partitionLabels(S) {
  const lastIndex = {};  for (let i = 0; i < S.length; i++) {
    lastIndex[S[i]] = i;
  }  let start = 0;
  let end = 0;
  const result = [];  for (let i = 0; i < S.length; i++) {
    end = Math.max(end, lastIndex[S[i]]);    if (i === end) {
      result.push(end - start + 1);
      start = end + 1;
    }
  }
  return result;
}

 

10.救生艇

1)题目描述

有一些人需要乘坐救生艇从一个岛屿到另一个岛屿。每个人的体重不同,而救生艇有一定的限重。每艘救生艇最多可同时乘坐两人,但条件是这两人的体重之和不超过限重。求解最少需要多少艘救生艇才能将所有人安全送到目的地。

2)解题步骤

为了解决救生艇的问题,我们可以使用贪心算法来解决。

 

  • 首先对人员的体重数组 people 进行排序,从小到大。
  • 使用两个指针 left 和 right 分别指向体重数组的起始位置和末尾位置。
  • 初始化 count 变量为 0,表示救生艇的数量。
  • 在循环中,比较 left 和 right 位置的人员体重之和:
  • 如果体重之和不超过限重,表示可以安排这两个人乘坐一艘救生艇,将 left 向右移动一位,将 right 向左移动一位,同时 count 加一。
  • 如果体重之和超过限重,表示无法安排这两个人乘坐同一艘救生艇,只能让 right 的人单独乘坐一艘救生艇,将 right 向左移动一位,同时 count 加一。

 

  • 循环结束后,返回 count 作为最少需要的救生艇数量。

下面是使用贪心算法解决救生艇问题的算法框架:

 

function numRescueBoats(people, limit) {
  people.sort((a, b) => a - b);  let left = 0;
  let right = people.length - 1;
  let count = 0;  while (left <= right) {
    if (people[left] + people[right] <= limit) {
      left++;
      right--;
    } else {
      right--;
    }
    count++;
  }
  return count;
}


带你读《图解算法小抄》二十二、贪心算法(8)https://developer.aliyun.com/article/1347845?groupCode=tech_library

相关文章
|
8月前
|
算法
算法:贪心算法的原理和基本思路
算法:贪心算法的原理和基本思路
|
19天前
|
算法
算法人生(3):从“贪心算法”看“战胜拖延”(完美主义版)
本文探讨了拖延症的一个常见原因——完美主义,并从贪心算法的角度提供启示。贪心算法通过局部最优决策逼近全局最优解,不保证全局最优,但寻求满意解。完美主义者的拖延源于高标准、过度关注细节、压力和时间管理困难。为解决这个问题,建议接受不完美,设定合理目标,追求良好效果,以及培养时间管理技巧。通过实例说明,调整心态和策略,可以提高工作效率并克服拖延。
|
19天前
|
算法 调度 C语言
算法--贪心算法
贪心算法是每次选择当前最优解,期望达到全局最优,适用于有最优子结构的问题。它不回退,与动态规划不同。适用于分数背包问题,但0-1背包问题可能无法保证最优解。常见应用包括找零、最小生成树、单源最短路径和任务调度。贪心算法步骤包括建模、分问题、求局部最优解及整合。尽管简单,但需谨慎评估是否适用,例如0-1背包问题可能需用动态规划求解。
21 1
|
19天前
|
算法 程序员
贪心算法(被黑心公司强迫写的降薪算法)
贪心算法(被黑心公司强迫写的降薪算法)
|
19天前
|
算法 调度 C++
[数据结构与算法]贪心算法(原理+代码)
[数据结构与算法]贪心算法(原理+代码)
|
19天前
|
人工智能 算法 Java
【算法设计与分析】— —单源最短路径的贪心算法
【算法设计与分析】— —单源最短路径的贪心算法
39 0
|
19天前
|
存储 算法 Java
【算法设计与分析】— —实现最优载的贪心算法
【算法设计与分析】— —实现最优载的贪心算法
35 1
|
19天前
|
存储 算法 Java
【算法设计与分析】— —实现活动安排问题的贪心算法。
【算法设计与分析】— —实现活动安排问题的贪心算法。
88 0
|
19天前
|
算法 调度 Python
Python高级算法——贪心算法(Greedy Algorithm)
Python高级算法——贪心算法(Greedy Algorithm)
241 3
|
19天前
|
存储 算法 程序员
【算法训练-贪心算法 一】买卖股票的最佳时机II
【算法训练-贪心算法 一】买卖股票的最佳时机II
38 0