从小白开始刷算法 双指针篇 leetcode.881

简介: 从小白开始刷算法 双指针篇 leetcode.881

881. 救生艇


给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。

每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。

返回 承载所有人所需的最小船数 。


示例 1:


输入:people = [1,2], limit = 3

输出:1

解释:1 艘船载 (1, 2)

示例 2:


输入:people = [3,2,2,1], limit = 3

输出:3

解释:3 艘船分别载 (1, 2), (2) 和 (3)

示例 3:


输入:people = [3,5,3,4], limit = 5

输出:4

解释:4 艘船分别载 (3), (3), (4), (5)


题目来源:力扣(LeetCode)


对撞双指针思路


能否写出:能写出。

时间:10多分钟

思路:


首先,对数组 people 进行排序,将人的体重按升序排列,这样可以方便后续的处理。

  1. 使用两个指针 ij 分别指向数组的开头和结尾。
  2. 进行循环,条件是 i <= j,即还有人需要运送。
  3. 在循环中,计算指针 ij 对应的人的体重之和 total
  4. 如果 total 小于等于限制值 limit,说明这两个人可以坐在同一艘船上。此时,将船数 result 加一,同时将指针 ij 分别向后移动一位,继续处理下一对人。
  5. 如果 total 大于限制值 limit,说明只能将指针 j 对应的人单独放在一艘船上。此时,将指针 j 向前移动一位,继续处理下一对人。
  6. 循环结束后,返回最少需要的船数 result
// 仅是我的思路代码,leetcode上大神更厉害
class Solution {
    public int numRescueBoats(int[] people, int limit) {
        int count = 0;
        Arrays.sort(people);
        int left = 0;
        int right = people.length-1;
        while (left<=right){
            int total = people[left]+people[right];
            if(total<=limit){
                count++;
                left++;
                right--;
                continue;
            }
            right--;
            count++;
        }
        return count;
    }
}

简化:

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

时间复杂度:O(nlogn) 有额外消耗在排序上

空间复杂度:O(logn)

相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
37 0
|
19天前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
21 2
|
2月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
51 4
双指针算法详解
|
1月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
49 6
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
48 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
50 1
|
3月前
|
算法 容器
【算法】双指针
【算法】双指针
|
3月前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针