【力扣周赛#331】6348. 从数量最多的堆取走礼物 + 6347. 统计范围内的元音字符串数 + 6346. 打家劫舍 IV

目录

6348. 从数量最多的堆取走礼物 - 堆排序ac

6347. 统计范围内的元音字符串数 - 前缀和ac

6346. 打家劫舍 IV - 二分答案


6348. 从数量最多的堆取走礼物 - 堆排序ac

堆排序

class Solution {
    public long pickGifts(int[] g, int k) {
        PriorityQueue q=new PriorityQueue<>((a,b)->(b-a));
        long res=0;
        for(int x:g) q.offer(x);
        while(k-->0)
        {
            int t=q.peek();
            q.poll();
            t=(int)Math.sqrt(t);
            q.offer(t);
        }
        while(!q.isEmpty())
        {
            res+=q.peek();
            q.poll();
        }
        return (long)res;
    }
}

6347. 统计范围内的元音字符串数 - 前缀和ac

class Solution {
    public boolean work(String s)
    {
        char a=s.charAt(0);
        char b=s.charAt(s.length()-1);
        if((a=='a'||a=='e'||a=='i'||a=='o'||a=='u')&&(b=='a'||b=='e'||b=='i'||b=='o'||b=='u')) return true;
        return false;
    }
    
    public int[] vowelStrings(String[] words, int[][] queries) {
        int n=words.length;
        int[] mp=new int[n+1];
        for(int i=0;i

6346. 打家劫舍 IV - 二分答案

力扣

思路:

最大值最小——二分

  • 二分搜索最小值答案mid     范围为【0,最大值】
  • check检查不能连续选的情况下,最大值为mid,数组中元素不能超过mid,统计能否选够k间房
  • 如果能,则进一步往小选,直到算出满足ck条件的最小值
class Solution {
    int[] nums=new int[100010];
    int k;
    public boolean ck(int mx) //不能连续选 最大值为mx 看能否选够k个元素
    {
        boolean f=true;
        int res=0;
        for(int x:nums)
        {
            if(x>mx) f=false; //一旦元素超过最大值mx 则不选 
            if(f) 
            {
                res++;
                f=false;
            }else f=true;
        }
        return res>=k;
    }

    public int minCapability(int[] nums, int k) {
        this.nums=nums;
        this.k=k;
        int l=0,r=Arrays.stream(nums).max().getAsInt();
        while(l>1;
            if(ck(mid)) r=mid;
            else l=mid+1;
        }
        return l;
    }
}

你可能感兴趣的:(leetcode周赛,leetcode,算法,c++,二分,前缀和)