• leetcode-06-[454]四数相加II[383]赎金信 [15] 三数之和 [18] 四数之和


    重点:

    三数之和、四数之和 适合用双指针

    哈希表需要考虑的边界条件太多

    一、[454]四数相加II

    1. class Solution {
    2. public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
    3. int count=0;
    4. HashMap map = new HashMap<>();
    5. for(int i:nums1) {
    6. for(int j:nums2) {
    7. int tmp=i+j;
    8. map.put(tmp,map.getOrDefault(tmp,0)+1);
    9. }
    10. }
    11. for(int i:nums3){
    12. for(int j:nums4){
    13. int tmp=i+j;
    14. if(map.containsKey(-tmp)){
    15. count+=map.get(-tmp);
    16. }
    17. }
    18. }
    19. return count;
    20. }
    21. }

    二、[383]赎金信

    1. class Solution {
    2. public boolean canConstruct(String ransomNote, String magazine) {
    3. if(ransomNote.length()>magazine.length()) {
    4. return false;
    5. }
    6. int[] res=new int[26];
    7. for(int i=0;i
    8. res[magazine.charAt(i)-'a']++;
    9. }
    10. for(int j=0;j
    11. res[ransomNote.charAt(j)-'a']--;
    12. }
    13. for(int k:res){
    14. if(k<0){
    15. return false;
    16. }
    17. }
    18. return true;
    19. }
    20. }

    三、[15] 三数之和

    1. class Solution {
    2. public List> threeSum(int[] nums) {
    3. //双指针
    4. //升序
    5. Arrays.sort(nums);
    6. //注意一下
    7. List> res = new ArrayList<>();
    8. int left,right;
    9. for(int i=0;i< nums.length;i++){
    10. left = i + 1;
    11. right = nums.length - 1;
    12. //剪枝
    13. if (nums[i] > 0) {
    14. return res;
    15. }
    16. //i去重
    17. if (i >= 1 && nums[i] == nums[i - 1]) {
    18. continue;
    19. }
    20. while (left < right) {
    21. int sum=nums[i] + nums[left] + nums[right];
    22. if(sum<0){
    23. left++;
    24. } else if (sum>0) {
    25. right--;
    26. }else {
    27. res.add(Arrays.asList(nums[i], nums[left], nums[right]));
    28. //去重,在找到三元组之后!!!!!
    29. while (left < right && nums[left] == nums[left + 1]) {
    30. left++;
    31. }
    32. while (left < right && nums[right] == nums[right - 1]) {
    33. right--;
    34. }
    35. left++;
    36. right--;
    37. }
    38. }
    39. }
    40. return res;
    41. }
    42. }

    四、[18] 四数之和 

    重点:

    a+b+c+d=target,先排序

    1、剪枝时,需要考虑负数的情况(与三数之和略有不同)

    如[-5,-4,0,1,2]  -6  

    其中 -5>-6  

    但-5+(-4)+1+2=--6  存在四元组

    只需要排序后的数组,在a>0时,再进行比较a>target即可,满足则剪枝

    2、去重

    b去重时,考虑[2,2,2,2,2]这种情况

    应该注意b 、a 可以相同,故 j > i+1(每次开始时 j = i+1)

    c、d 去重时,应在找到四元组之后,注意 if 与 while 的使用

    3、int会溢出

    nums[k] + nums[i] + nums[left] + nums[right] > target  int会溢出

    1. class Solution {
    2. public List> fourSum(int[] nums, int target) {
    3. Arrays.sort(nums);
    4. List> res = new ArrayList<>();
    5. for(int i=0;i< nums.length;i++){
    6. //剪枝 考虑负数的情况 [-5,-4,0,1,4] -6 -5>-6 -5+(-4)=-9仍然存在
    7. if(nums[i]>0&&nums[i]>target){
    8. return res;
    9. }
    10. //去重
    11. if(i>=1&&nums[i]==nums[i-1]){
    12. continue;
    13. }
    14. for(int j=i+1;j< nums.length;j++){
    15. int left=j+1;
    16. int right= nums.length-1;
    17. //去重 注意j>i+1 j与i值可以相同[2,2,2,2,2]
    18. if(j>i+1&&nums[j]==nums[j-1]){
    19. continue;
    20. }
    21. while(left
    22. // 注意 int 会溢出
    23. // nums[k] + nums[i] + nums[left] + nums[right] > target int会溢出
    24. long sum=(long)nums[i]+nums[j]+nums[left]+nums[right];
    25. if(sum
    26. left++;
    27. } else if (sum>target) {
    28. right--;
    29. }else {
    30. List list = Arrays.asList(nums[i], nums[j], nums[left], nums[right]);
    31. res.add(list);
    32. //left去重
    33. while (left1]){
    34. left++;
    35. }
    36. //right去重
    37. while(left1]){
    38. right--;
    39. }
    40. left++;
    41. right--;
    42. }
    43. }
    44. }
    45. }
    46. return res;
    47. }
    48. }

  • 相关阅读:
    图扑软件荣获第七届“创客中国”中小企业创新创业大赛优胜奖!
    【2023年11月第四版教材】第22章《组织通用治理》(合集篇)
    和大于等于 target 的最短子数组 python解答
    vue3脚手架搭建
    [cpp primer随笔] 17. 类中名字的查找机制
    扩散模型的系统性学习(一):DDPM的学习
    StringRedisTemplate与RedisTemplate的区别,以及Redis的工具类封装
    SSM整合shiro
    字符(串)及内存操作库函数
    视频质量度量VQM算法详细介绍
  • 原文地址:https://blog.csdn.net/weixin_44925711/article/details/139624564