Leetcode Weekly Contest 241(详细解析)

题目链接: Leetcode Weekly Contest 241

写在前面:

本次周赛惨遭零封。

1、1863. Sum of All Subset XOR Totals

难度:Easy

题目大意:

详见题意。

思路:

参考高赞回答,穷举数组所有的子序列,用位运算来提高速度。

代码

class Solution {
    //参考https://leetcode.com/contest/weekly-contest-241/problems/sum-of-all-subset-xor-totals/
    public int subsetXORSum(int[] nums) {
        int n=nums.length;
        int res=0;
        for(int i=0;i<(1<<n);i++){
            int xorSum=0;
            for(int j=0;j<n;j++){
                if((i&(1<<j))>0){
                    xorSum^=nums[j];
                }
            }
            res+=xorSum;
        }
        return res;
    }
}

2、1864. Minimum Number of Swaps to Make the Binary String Alternating

难度:Medium

题目大意:

详见题目。

思路:

参考高赞回答。最终的字符串要么是101010……要么是010101……所有原始字符串中0和1的个数相差不能超过1。

代码

class Solution {
    public int minSwaps(String s) {
        int n=s.length();
        int zero=0,one=0;
        for(char c:s.toCharArray()){
            if(c=='0'){
                zero++;
            }
            else{
                one++;
            }
        }
        if(Math.abs(one-zero)>1){
            return -1;
        }
        if(zero-one==1){//说明字符串是以0开头的,010101...
            return helper(s,'0');
        }
        else if(zero==one){
            return Math.min(helper(s,'0'),helper(s,'1'));
        }
        else{
            return helper(s,'1');
        }
    }
    public int helper(String s,char c){
        int diff=0;//字符不相同的个数
        for(char c1:s.toCharArray()){
            if(c1!=c){
                diff++;
            }
            c=(c=='0'?'1':'0');
        }
        return diff/2;
    }
}

3、1865. Finding Pairs With a Certain Sum

难度:Medium

题目大意:

详见题目。

思路:

参考高赞回答

代码

class FindSumPairs {
    int[] arr1;
    int[] arr2;
    Map<Integer,Integer> map=new HashMap<>();//统计nums2[]中各个元素的个数
    public FindSumPairs(int[] nums1, int[] nums2) {
        arr1=nums1;
        arr2=new int[nums2.length];
        for(int i=0;i<nums2.length;i++){
            arr2[i]=nums2[i];
            map.put(nums2[i],map.getOrDefault(nums2[i],0)+1);
        }
    }
    
    public void add(int index, int val) {
        map.put(arr2[index],map.get(arr2[index])-1);
        arr2[index]+=val;
        map.put(arr2[index],map.getOrDefault(arr2[index],0)+1);
    }
    
    public int count(int tot) {
        int num=0;
        for(int i=0;i<arr1.length;i++){//nums1[]中元素个数较少,所以遍历nums1,遍历nums2会超时
            if(map.get(tot-arr1[i])!=null){
                num=num+map.get(tot-arr1[i]);
            }
        }
        return num;
    }
}

/**
 * Your FindSumPairs object will be instantiated and called as such:
 * FindSumPairs obj = new FindSumPairs(nums1, nums2);
 * obj.add(index,val);
 * int param_2 = obj.count(tot);
 */

4、1866. Number of Ways to Rearrange Sticks With K Sticks Visible

难度:Hard

题目大意:

详见题目。

思路

参考高赞回答,思路非常巧妙,先考虑最后一个元素,根据最后一个元素是不是最大值分情况讨论,通过动态规划求解。

代码

class Solution {
    int[][] dp=new int[1001][1001];
    int mod=1000000007;
    public int rearrangeSticks(int n, int k) {
        if(n==k){
            return 1;
        }
        if(k==0){
            return 0;
        }
        if(dp[n][k]==0){
            dp[n][k]=(int)((1L*rearrangeSticks(n-1,k-1)+1L*(n-1)*rearrangeSticks(n-1,k))%mod);
        }
        return dp[n][k];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值