1431. 拥有最多糖果的孩子(数组)

1.题目描述

给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。

对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目。

示例 1:

输入:candies = [2,3,5,1,3], extraCandies = 3
输出:[true,true,true,false,true] 
解释:
孩子 1 有 2 个糖果,如果他得到所有额外的糖果(3个),那么他总共有 5 个糖果,他将成为拥有最多糖果的孩子。
孩子 2 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
孩子 3 有 5 个糖果,他已经是拥有最多糖果的孩子。
孩子 4 有 1 个糖果,即使他得到所有额外的糖果,他也只有 4 个糖果,无法成为拥有糖果最多的孩子。
孩子 5 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。

2.C++版本

2.1 先求出最大值,分别与剩余糖果相加,与最大值比较(vector)

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

/*
先求出最大值
再分别相加,和最大值作比较
执行用时:4 ms, 在所有 C++ 提交中击败了85.62%的用户
内存消耗:8.9 MB, 在所有 C++ 提交中击败了61.70%的用户
*/

vector<bool> kidsWithCandies(vector<int> &candies, int extraCandies)
{
    vector<bool> ans;
    int maxValue = candies[0];
    int i;
    for (i = 0; i < candies.size(); i++)
    {
        if (candies[i] > maxValue)
        {
            maxValue = candies[i];
        }
    }
    for (i = 0; i < candies.size(); i++)
    {
        if (candies[i] + extraCandies < maxValue)
            //不能写成ans[i]=false;
            ans.push_back(false);
        else
            ans.push_back(true);
    }
    return ans;
}

int main()
{
    int nums[6] = {1, 2, 3, 1, 1, 3};
    vector<int> vec(nums, nums + 6);
    int extraCandies = 2;
    vector<bool> ans = kidsWithCandies(vec, extraCandies);
    for (int i = 0; i < ans.size(); i++)
    {
        cout << ans[i] << "  ";
    }
    cout << endl;
    return 0;
}

2.2 求vector中最大值,使用#include <algorithm>中max_element()

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;

/*
先求出最大值
再分别相加,和最大值作比较
执行用时:4 ms, 在所有 C++ 提交中击败了85.52%的用户
内存消耗:8.8 MB, 在所有 C++ 提交中击败了87.73%的用户
*/

vector<bool> kidsWithCandies(vector<int> &candies, int extraCandies)
{
    //建议一个和candies大小相同的bool的vector
    vector<bool> ans(candies.size(), false);

    auto maxValue = max_element(candies.begin(), candies.end());
    //vector<int>::iterator maxValue = max_element(begin(candies), end(candies));
    for (int i = 0; i < candies.size(); i++)
    {
        if (candies[i] + extraCandies >= *maxValue)
            ans[i] = true;
    }
    return ans;
}

int main()
{
    int nums[6] = {1, 2, 3, 1, 1, 3};
    vector<int> vec(nums, nums + 6);
    int extraCandies = 1;
    vector<bool> ans = kidsWithCandies(vec, extraCandies);
    for (int i = 0; i < ans.size(); i++)
    {
        cout << ans[i] << "  ";
    }
    cout << endl;
    return 0;
}

3.java版本

package com.array.easy.LeetCode1431;

import java.util.ArrayList;
import java.util.List;

/**
 * @author GMT
 * @version 1.0
 * @data 2020年10月13日
 */
public class Solution {
    /*
     *方法:先求出数组中最大值,然后分别与extraCandies相加,与最大值进行比较
     *执行用时:1 ms, 在所有 Java 提交中击败了99.88%的用户内存消耗:38 MB, 在所有 Java 提交中击败了100.00%的用户
     */
    public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
        //找出candies中最大的值,没有类似max的方法
        int maxValue = candies[0];
        for (int i = 1; i < candies.length; i++) {
            if (candies[i] > maxValue)
                maxValue = candies[i];
        }
        List list = new ArrayList();
        for (int i = 0; i < candies.length; i++) {
            if (extraCandies + candies[i] >= maxValue)
                list.add(true);
            else
                list.add(false);
        }
        return list;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] candies = {2, 4, 5, 9};
        int extraCandies = 6;
        List ans = solution.kidsWithCandies(candies, extraCandies);
        System.out.println(ans);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值