代码随想录算法训练营第7天|四数相加II、赎金信、三数之和

lc454四数相加||

思路

使用map将时间复杂度将至n^2

代码

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int res = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (int num1 : nums1){
            for (int num2 :nums2){
                map.put(num1+num2, map.getOrDefault(num1+num2, 0)+1);
            }
        }
        for (int num3 : nums3){
            for (int num4 : nums4){
                res += map.getOrDefault(-num3-num4, 0);
            }
        }
        return res;
    }
}

lc383赎金信

思路

map的简单应用

代码

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Character, Integer> map = new HashMap<>();
        char[] mag = magazine.toCharArray();
        for (char ch : mag){
            map.put(ch, map.getOrDefault(ch,0)+1);
        }
        char[] rand = ransomNote.toCharArray();
        for (char ch : rand){
            map.put(ch, map.getOrDefault(ch,0)-1);
        }
        for (int item : map.values()){
            if (item < 0){
                return false;
            }
        }
        return true;
    }
}

lc15三数之和

思路

一个循环遍历(确定一个数),双指针确定另外两个数,注意添加成功后的两元素去重和循环遍历中的定元素去重

代码

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        if (nums[0] > 0){ return res; }
        for (int k = 0; k < nums.length-2; k++){
            int i = k + 1, j = nums.length-1;
            if (k > 0 && nums[k] == nums[k-1]){
                continue;
            }
            while (i < j){
                if (nums[k] + nums[i] + nums[j] == 0){
                    res.add(Arrays.asList(nums[k],nums[i],nums[j]));
                    while(i < j && nums[j]==nums[j-1]){ j--; }
                    while(i < j && nums[i]==nums[i+1]){ i++; }
                    j--;
                    i++;
                } else if (nums[k] + nums[i] + nums[j] > 0){
                    j--;
                } else {
                    i++;
                }
            }
        }
        return res;
    }
}

lc18四数之和

思路

三数之和的基础上多加一层循环,注意去重时的条件

代码

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);  // 排序数组
        List<List<Integer>> res = new ArrayList<>();  // 结果集
        for (int k = 0; k < nums.length; k++) {
            if (nums[k] > target && nums[k] >= 0){//非负且大于target,加上就会超
                continue;
            }
            if (k > 0 && nums[k] == nums[k-1]){//nums[k]去重
                continue;
            }
            for (int i = k+1; i < nums.length; i++){
                if (nums[k]+nums[i] > target && nums[k]+nums[i] >= 0){
                    continue;
                }
                if (i > k+1 && nums[i] == nums[i-1]){
                    continue;
                }
                int left = i+1, right = nums.length-1;
                while (left < right){
                    long sum = (long) nums[k] + nums[i] + nums[left] + nums[right];
                    if (sum > target){
                        right--;
                    } else if (sum < target){
                        left++;
                    } else {
                        res.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right]));
                        while (left <right && nums[left] == nums[left+1]){ left++; }
                        while (left <right && nums[right] == nums[right-1]){ right--; }
                        left++;
                        right--;
                    }
                }
            }
        }
        return res;
    }
}

全部评论

相关推荐

和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务