当前位置: 首页 > news >正文

每日算法-250428

每日算法 - 2024年4月28日

记录今天完成的几道 LeetCode 算法题。


1877. 数组中最大数对和的最小值

题目描述:
题目图片

思路

贪心策略。

解题过程

为了最小化所有数对和中的最大值,直观的想法是避免让两个较大的数相加。因此,最优策略是将数组中最小的元素与最大的元素配对,次小的元素与次大的元素配对,以此类推。这样可以使得每个数对的和相对均衡,从而让其中的最大和尽可能小。

具体步骤如下:

  1. 对数组 nums 进行升序排序。
  2. 使用双指针 leftright 分别指向数组的开头和结尾。
  3. 初始化一个变量 ret 来记录遇到的最大数对和,初始值为 0。
  4. left < right 时,持续循环:
    • 计算当前配对 nums[left] + nums[right] 的和。
    • 更新 ret = Math.max(ret, nums[left] + nums[right])
    • left 指针右移一位 (left++),right 指针左移一位 (right--),考虑下一对元素。
  5. 循环结束后,ret 即为所求的最小的最大数对和。

复杂度

  • 时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN),主要开销在于对数组进行排序。
  • 空间复杂度: O ( 1 ) O(1) O(1) O ( log ⁡ N ) O(\log N) O(logN),取决于排序算法所使用的额外空间(原地排序通常认为是 O ( 1 ) O(1) O(1) 额外空间)。

Code

class Solution {public int minPairSum(int[] nums) {Arrays.sort(nums);int ret = 0;int left = 0, right = nums.length - 1;while (left < right) {ret = Math.max(ret, (nums[left] + nums[right]));left++;right--;}return ret;}
}

881. 救生艇

题目描述:
题目图片

思路

贪心策略。

解题过程

目标是使用最少的船只。每艘船最多载两人,且总重量不超过 limit。为了最大化每艘船的利用率(即尽量让每艘船载两人),我们应该优先考虑最重的人。

具体步骤如下:

  1. people 数组(代表每个人的体重)进行升序排序。
  2. 使用双指针 left 指向体重最轻的人,right 指向体重最重的人。
  3. 初始化船只数量 boats = 0
  4. left <= right 时,持续循环(<= 是为了处理最后只剩一人的情况):
    • 每次循环代表需要派遣一条新船,因此 ret++
    • 让最重的人 (people[right]) 上船。
    • 检查当前最轻的人 (people[left]) 是否能和这位最重的人同乘一条船,即判断 people[left] + people[right] <= limit
    • 如果可以同乘 (people[left] + people[right] <= limit),那么最轻的人也上船,将 left 指针右移一位 (left++)。
    • 无论最轻的人是否能上船,最重的人都已经确定要上这条船了,所以将 right 指针左移一位 (right--)。
  5. 循环结束后,ret 即为所需的最小船只数量。

复杂度

  • 时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN),主要开销在于排序。
  • 空间复杂度: O ( 1 ) O(1) O(1) O ( log ⁡ N ) O(\log N) O(logN),取决于排序算法使用的额外空间。

Code

class Solution {public int numRescueBoats(int[] people, int limit) {Arrays.sort(people);int left = 0, right = people.length - 1;int ret = 0;while (left <= right) {int light = people[left];int weight = people[right];ret++;right--;if (light + weight <= limit) {left++;}}return ret;}
}

2592. 最大化数组的伟大值

题目描述:
题目图片

思路

贪心策略。

解题过程

题目要求找到数组 nums 的一个排列 perm,使得满足 nums[i] < perm[i] 的索引 i 的数量最大化。这个最大数量就是数组的“伟大值”。

一个有效的贪心策略是:

  1. 对原数组 nums 进行升序排序。
  2. 我们希望为尽可能多的 nums[i] 找到一个比它大的 nums[j] 来作为 perm[i]。为了给后面的 nums 元素留下更多(可能更大)的选择,对于当前的 nums[i],我们应该寻找满足 nums[j] > nums[i] 的最小的 nums[j] 来进行配对。
  3. 使用双指针 ij 来实现这个过程:
    • 指针 i:指向当前需要寻找配对的元素 nums[i]
    • 指针 j:指向可用于配对的候选元素 nums[j]
  4. 初始化 i = 0, j = 1,以及伟大值计数 greatness = 0
  5. j 未越界 (j < nums.length) 时,持续循环:
    • 如果 nums[i] < nums[j]: 找到了一个有效的配对。nums[j] 可以作为 nums[i]perm[i]。增加伟大值 greatness++。同时移动两个指针 i++j++,表示 nums[i]nums[j] 都已被使用,接下来考虑 nums[i+1]nums[j+1]
    • 如果 nums[i] >= nums[j]: 说明 nums[j] 不够大,不能与 nums[i] 配对。我们需要一个更大的元素来配对 nums[i]。因此,保持 i 不动,只移动 j 指针 (j++),去寻找下一个可能满足条件的 nums[j]
  6. 循环结束后,greatness 即为最大化的伟大值。

复杂度

  • 时间复杂度: O ( N log ⁡ N ) O(N \log N) O(NlogN),主要开销在于排序。
  • 空间复杂度: O ( 1 ) O(1) O(1) O ( log ⁡ N ) O(\log N) O(logN),取决于排序算法使用的额外空间。

Code

import java.util.Arrays;class Solution {public int maximizeGreatness(int[] nums) {// 1. 对数组排序Arrays.sort(nums);int n = nums.length;int greatness = 0; // 记录伟大值int i = 0; // 指向需要被配对的元素 nums[i]int j = 1; // 指向用于配对的候选元素 nums[j]// 2. 使用双指针寻找配对while (j < n) {if (nums[i] < nums[j]) {// 找到有效配对 (nums[i], nums[j])greatness++;i++; // 移动 i,考虑下一个需要配对的元素j++; // 移动 j,考虑下一个候选元素} else {// nums[j] 不够大,不能配对 nums[i]// 保持 i 不动,移动 j 寻找更大的候选元素j++;}}// 3. 返回结果return greatness;}
}

相关文章:

  • 从千兆到40G:飞速(FS)助力制造企业构建高可靠智能生产网络
  • 【JavaScript】相等运算符、条件运算符
  • 爱芯元智/芯昇,XS9950A,1 通道AHD模拟视频
  • 02 面向对象
  • 游戏盾与高防CDN的协同防御策略分析
  • 网络准入控制系统推荐:2025年构建企业网络安全的第一道防线
  • 【深度学习】#10 注意力机制
  • MQ-2烟雾传感器
  • 基于 BERT 微调一个意图识别(Intent Classification)模型
  • 在前端应用领域驱动设计(DDD):必要性、挑战与实践指南
  • 2025三掌柜赠书活动第十五期:高并发系统:设计原理与实践
  • GRPO有什么缺点,如何改进?
  • leetcode 2302. 统计得分小于 K 的子数组数目 困难
  • 工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能
  • 可调用对象(2)-仿函数
  • 【漫话机器学习系列】229.特征缩放对梯度下降的影响(The Effect Of Feature Scaling Gradient Descent)
  • 【氮化镓】质子辐照对 GaN-on-GaN PiN 二极管电导调制的影响
  • 专业测量中的示波器噪声抑制技巧
  • Docker镜像技术深度解析
  • 如何从大规模点集中筛选出距离不小于指定值的点
  • 人社部:我国劳动力市场潜力足,韧性强
  • 商超展销延长、专区专柜亮相……上海“外贸拓内销”商品与市民见面
  • 伊朗港口爆炸已致40人死亡
  • 合肥一季度GDP为3003.88亿元,同比增长6.6%
  • 委员呼吁提高政府机构电话号码准确性,辽宁阜新回应
  • 精准滴灌“种企业”,苏南强县常熟新的进阶密码