代码随想录算法训练营第六天

两数之和

题目:LeetCode.1

接口:java.util.Map

实现:

  • java.util.HashMap<K, V>:哈希表
  • java.util.TreeMap<K, V>:平衡树

函数:

  • put(key, value):添加关键字和其对应的值

  • get(key):返回关键字对应的值

  • containsKey(key):是否包含关键字

  • remove(key):删除关键字

  • size():返回元素数

  • isEmpty():是否为空

  • clear():清空

  • entrySet():获取Map中的所有对象的集合

  • Map.Entry<K, V>:Map中的对象类型

    • getKey():获取关键字

    • getValue():获取值

import java.util.*;
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] arr = new int[2];//存结果
    if(nums == null || nums.length == 0){
        return arr;
    }
    Map<Integer, Integer> res = new HashMap<>();
    for(int i = 0; i < nums.length; i++){
        int tmp = target - nums[i];
        if(res.containsKey(tmp)){
            arr[1] = i;
            arr[0] = res.get(tmp);
        }
        res.put(nums[i], i);
    }
    return arr;
    }
}

四数相加Ⅱ

题目:LeetCode.454

本题使用的是哈希法,题目中没有排除重复。

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer, Integer> map = new HashMap<>();
        int cnt = 0;
        for (int i : nums1){
            for (int j : nums2){
                int tmp1 = i + j;
                if (!map.containsKey(tmp1)){
                    map.put(tmp1,1);
                }
                else{
                    map.put(tmp1, map.get(tmp1) + 1);
                }  
            }
        }
        for (int i : nums3){
            for (int j : nums4){
                int tmp2 = i + j;
                if(map.containsKey(-tmp2)){
                    cnt += map.get(-tmp2);
                }
            }
        }
        return cnt;
    }
}

赎金信

题目:LeetCode.383

使用map的做法

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Character, Integer> map = new HashMap<>();
        for (char c : magazine.toCharArray()){
            if (!map.containsKey(c)){
                    map.put(c,1);
            }
            else{
                    map.put(c, map.get(c) + 1);
            }  
        }
        for (char c : ransomNote.toCharArray()){
            if (map.containsKey(c)){
                map.put(c, map.get(c) - 1);
                if (map.get(c) < 0) return false;
            }
            else return false;
        }
        return true;
    }
}

三数之和

题目:LeetCode.15

接口:java.util.List<>

实现:

  • java.util.ArrayList<>:变长数组
  • java.util.LinkedList<>:双链表

函数

  • add():在末尾添加一个元素
  • clear():清空
  • size():返回长度
  • isEmpty():是否为空
  • get(i):获取第i个元素
  • set(i, val):将第i个元素设置为val

本题的关键是去重。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);//从小到大排序
        for(int i = 0 ; i < nums.length ; i++){
            if(nums[i] > 0) return list;//优化
            if(i > 0 && nums[i] == nums[i - 1]) continue;//去重
            int l = i + 1;
            int r = nums.length - 1;
            while (l < r){
                int sum = nums[i] + nums[l] + nums[r];
                if (sum == 0){
                    List<Integer> newlist = new ArrayList<>();
                    newlist.add(nums[i]);
                    newlist.add(nums[l]);
                    newlist.add(nums[r]);
                    list.add(newlist);
                    while(l < r && nums[r - 1] == nums[r]) r--; //去重
                    while(l < r && nums[l + 1] == nums[l]) l++;//去重
                    r--;
                    l++;
                }
                else if (sum > 0)  r--;
                else l++;
            }    
        }
        return list;
    }
}

四数之和

题目:LeetCode.18

和三数之和整体思维一样,注意是两层for循环,注意去重。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0 ; i < nums.length ; i++){
            if(nums[i] > 0 && nums[i] > target) return list;//注意target的取值可能为负数
            if(i > 0 && nums[i] == nums[i - 1]) continue;
            for(int j = i + 1 ; j < nums.length ; j++){
                if(j > i + 1 && nums[j] == nums[j - 1]) continue;
                int l = j + 1;
                int r = nums.length - 1;
                while (l < r){
                    int sum = nums[i] + nums[j] + nums[l] + nums[r];
                    if(sum == target){
                        List<Integer> newlist = new ArrayList<>();
                        newlist.add(nums[i]);
                        newlist.add(nums[j]);
                        newlist.add(nums[l]);
                        newlist.add(nums[r]);
                        list.add(newlist);
                        while (l < r && nums[l] == nums[l + 1]) l++;
                        while (l < r && nums[r] == nums[r - 1]) r--;
                        l++;
                        r--;
                    }
                    else if (sum < target) l++;
                    else r--;
                }  
            }

        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值