美文网首页
leetcode881 救生艇

leetcode881 救生艇

作者: 奥利奥蘸墨水 | 来源:发表于2020-04-03 00:22 被阅读0次

题目

救生艇

暴力解法:模拟(超时)

题目的意思其实就是给定一个数组,然后把这些数放到限定大小的位置,每个位置最多放两个数,且大小是最多是两个数的和。

根据题意就想到一种模拟的方法。因为题目说一定是可以完全放置的,所以不可能存在某一个数的大小超过limit,故最多的情况是每个数放一个位置,那么最多需要n个位置。

用一个长度为n的数组模拟这些位置。对原始数组从大到小排序,对每一个数都左到右遍历一下可以放到哪个位置。

时间复杂度:排序O(n * log(n)) + 两边循环O(n * n) = O(n * n)

代码
class Solution {
public:
    int numRescueBoats(vector<int>& nums, int limit) {
        sort(nums.begin(), nums.end(), greater<int>());

        vector<int> vec(nums.size(), 0);
        vector<int> cnt(nums.size(), 0);
        int k = 0;
        for (int i = 0; i < nums.size(); i++) {
            for (int j = 0; j <= k + 1; j++) {
                if (cnt[j] < 2 && vec[j] + nums[i] <= limit) {
                    vec[j] += nums[i];
                    cnt[j]++;
                    if (j == k + 1) {
                        k++;
                    }
                    break;
                }
            }
        }
        for (int i = 0; i < nums.size(); i++) {
            if (vec[i] == 0) {
                return i;
            }
        }

        return nums.size();
    }
};

排序 + 双指针

想到这个解法的关键点就在于每个位置最多放两个数,如果在某个位置我们放了一个最大的数,那么是不是只要判断一下最小的数能不能放在这里,就能确定这个位置仅由这个最大的数独占,还是和这个最小的数一起占有?我们可以简单证明一下。

对于一个排好序的数组num = [a1, a2, a3, an],an最大,a1最小。如果a1 + an > limit,由于a2 >= a1,所以a2 + an > limit,说明如果an不和a1配对占有一个位置,必定就是an独占一个位置。

代码
class Solution {
public:
    int numRescueBoats(vector<int>& nums, int limit) {
        sort(nums.begin(), nums.end());
        
        int i = 0, j = nums.size() - 1;
        int res = 0;

        while (i <= j) {
            //最小的数和最大的数共同占有一个位置,指向小的位置的指针向后挪一位
            if (nums[i] + nums[j] <= limit) {
                i++;
            }
            //无论是否跟小的数一起占有,大的数总会占有一个位置。
            j--;
            res++;
        }
        return res;
    }
};

相关文章

  • leetcode881 救生艇

    题目 救生艇 暴力解法:模拟(超时) 题目的意思其实就是给定一个数组,然后把这些数放到限定大小的位置,每个位置最多...

  • 救生艇

    “哦!得了吧,哈利你听多了那些糊弄新手的故事。”坐在摇晃船上的艾利克斯带着轻蔑冲着金发年轻男子一笑。随后低下头仔细...

  • 无长江口外轮沉没尚有12人下落不明 沉船位置已确定

    图说:目前,东雷6正在打捞救生艇,而救生艇附近水域正是难船的沉没位置。上海海事局供图 今天(4月6日)凌晨,上海海...

  • 双11-11的感悟

    生活是条沉船,但我们不要忘了在救生艇上唱歌。

  • 得脱救生艇

    1、与清廉的伙伴为伍,山洞/28【在早晨和晚夕祈祷自己的主而求其喜悦者,你应当耐心地和他们在一起,不要藐视他们,而...

  • leetcode 881 救生艇

    思路:双指针第一种不移动指针,往外弹元素;第二种移动指针,首尾两人之和如果大于限重,则第一个人坐船,否则两个人做。...

  • 881. 救生艇

    881. 救生艇[https://leetcode-cn.com/problems/boats-to-save-p...

  • 881-救生艇

    暴力解只能解决一部分的case WARNING:明显是一开始没有理解题意,题意是一艘船最多载两个人,而且不是一定要...

  • 881. 救生艇

    2021-08-26 LeetCode每日一题 链接:https://leetcode-cn.com/proble...

  • 翻译

    官方说:周日,西班牙加那利群岛一艘游轮上的一艘救生艇坠入港口约65英尺,一根缆绳折断,将船员困在救生艇下方,造成5...

网友评论

      本文标题:leetcode881 救生艇

      本文链接:https://www.haomeiwen.com/subject/qhbqphtx.html