day 03 leetcode 1431 最短串

给定每个孩子已有的糖果数量和额外糖果数,判断是否可以通过分配额外糖果使每个孩子都有可能拥有最多糖果。此外,寻找长数组中包含短数组所有元素的最短连续子数组,返回其起始和结束索引。示例展示了如何实现这两个功能。
摘要由CSDN通过智能技术生成

给你一个数组 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:

输入:candies = [4,2,1,1,2], extraCandies = 1
输出:[true,false,false,false,false]
解释:只有 1 个额外糖果,所以不管额外糖果给谁,只有孩子 1 可以成为拥有糖果最多的孩子。
示例 3:

输入:candies = [12,1,12], extraCandies = 10
输出:[true,false,true]
提示:

2 <= candies.length <= 100
1 <= candies[i] <= 100
1 <= extraCandies <= 50

class Solution {
    public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {

        int max = 0;
        for (int temp:candies){
            if (temp>max){
                max = temp;
            }
        }

        List<Boolean> res = new ArrayList<>();
        for (int i : candies) {
            res.add(i + extraCandies >= max);
        }
        return res;
    }
}

假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。

返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。

示例 1:

输入:
big =
[7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7]
small = [1,5,9]

输出: [7,10]
示例 2:

输入:
big =
[1,2,3]
small = [4]

输出: []
提示:

big.length <= 100000
1 <= small.length <= 100000

class Solution {
    public int[] shortestSeq(int[] big, int[] small) {
        int n = big.length, m = small.length;
        if(n < m) return new int[]{};
        Map<Integer, Integer> map = new HashMap<>();
        for (int e : small) {
            map.put(e, 1);
        }

        int l = 0, r = 0, k = m, minLen = Integer.MAX_VALUE, minL = -1, minR = -1;
        while(r < n){
            Integer num = map.get(big[r]);
            if(num != null){
                map.put(big[r], num - 1);
                if(num == 1) k--;
            }
            if (k == 0){
                while(k == 0){
                    num = map.get(big[l]);
                    if(num != null){
                        if(num == 0) k++;
                        map.put(big[l], num + 1);
                    }
                    l++;
                }
                if(r - l + 2 < minLen){
                    minLen = r - l + 2;
                    minL = l - 1;
                    minR = r;
                }
            }
            r++;
        }
        if(minL == -1) return new int[]{};
        return new int[]{minL, minR};
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值