首页 > 编程语言 >代码随想录算法训练营第六天

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

时间:2023-09-12 19:44:22浏览次数:31  
标签:right nums int 训练营 随想录 ++ 第六天 length left

代码随想录算法训练营第六天 | LeetCode 454(四数相加II) LeetCode 383(赎金信) LeetCode 15(三数之和) LeetCode 18(四数之和)

454:四数相加II

LeetCode 454(四数相加II)
思路:

首先定义 一个map,key放a和b两数之和,value放a和b两数之和出现的次数。
遍历nums1和nums2数组,统计两个数组元素之和,和出现的次数,放到map中。
定义int变量resCount,用来统计 a+b+c+d = 0 出现的次数。
在遍历nums3和nums4数组,找到如果 -(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
最后返回统计值 resCount

import java.util.HashMap;
import java.util.Map;
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer,Integer> res = new HashMap<Integer,Integer>();
        int resCount = 0;
        for (int num1 : nums1) {
            for (int num2 : nums2) {
                Integer count = res.get(num1+num2);
                res.put(num1 + num2,null == count ? 1 : ++count);
            }
        }
        for (int num3 : nums3) {
            for (int num4 : nums4) {
                if(res.containsKey(-(num3+num4))){
                    resCount += res.get(-(num3+num4));
                }
            }
        }
        return resCount;
    }
}

383:赎金信

LeetCode 383(赎金信)
思路:

题目意思:用magazine中的小写字母去组成ransomNote,且magazine中的元素不可重复使用
用一个长度为26的数组来记录magazine里字母出现的次数。
然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        //判空
        if(ransomNote == null){
            return false;
        }
        if(magazine == null){
            return false;
        }
        //当magazine的长度小于ransomNote时,直接返回false
        if (ransomNote.length() > magazine.length()) {
            return false;
        }
        int length = Math.max(ransomNote.length(), magazine.length());
        int rLen = ransomNote.length();
        int mLen = magazine.length();
        int[] array = new int[26];
        //这里维护array这个记录数组
        for(int i = 0; i < length; i++){
            //记录ransomNote当前索引元素
            if(i < rLen){
                array[ransomNote.charAt(i) - 'a']++;
            }
            //消费
            if(i < mLen){
                array[magazine.charAt(i) - 'a']--;
            }
        }
        //检查array
        for(int i = 0; i < 26; i++){
            //当数组有一个索引位置值大于0时 就意味着magazine提供满足不了ransomNote的需要
            if(array[i] > 0){
                return false;
            }
        }
        return true;
    }
}

15:三数相加

LeetCode 15(三数之和)

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        //先对数组进行排序(其实感觉也可以不用 但不用的话后面的剪枝条件要进行修改)
        Arrays.sort(nums);
        //排序后 若第一个元素直接大于0 那么可以直接返回
        if(nums[0] > 0 ){
            return result;
        }
        //双指针
        int left;
        int right;
        //循环条件 因为是三数之和 那么其实循环到nums.length - 2 就可以结束了
        for (int i = 0; i < nums.length - 2; i++){
            //去重 如果说前一个元素和当前元素相等的话 
            //那么就意味着这个元素的组合已经被记录了
            if(i > 0 && nums[i] == nums[i - 1]){
                continue;
            }
            left =  i + 1;
            right = nums.length - 1;
            while(left < right){
                //找到目标
                if(nums[i] + nums[left] + nums[right] == 0){
                    //记录
                    List<Integer> temp = new ArrayList<Integer>();
                    temp.add(nums[i]);
                    temp.add(nums[left]);
                    temp.add(nums[right]);
                    result.add(temp);
                    //指针位移 + 去重
                    while(left < right && nums[right] == nums[right - 1 ]){
                        right--;
                    }
                    while(left < right && nums[left] == nums[left + 1 ]){
                        left++;
                    }
                    right--;
                    left++;
                }
                //因为是排序过后的数组 当三个数之和小于了0 那么就意味着需要增大left指针
                else if(nums[i] + nums[left] + nums[right] < 0){
                    left++;
                }
                //同理 减小right
                else{
                    right--;
                }
            }
        }
        return result;
    }
}

18:四数相加

LeetCode 18(四数之和)
思路:

这道题和三数之和一个思路
也就是说你可以先确定一个索引值 把它当作三数之和等于的那个‘零’
那么就可以讲四数之和为零 降维成三数之和等于一个索引值
同理 五数之和,六数之和。。。就可以依次降维

import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        int left;
        int right;
        int tempTarget;
        for (int k = 0; k < nums.length - 3; k++){
            if(nums[k] > target && nums[k] > 0){
                return result;
            }
            //这就是那个索引值
            tempTarget = target - nums[k];
            if(k > 0 && nums[k-1] == nums[k]){
                continue;
            }
            //这里跟三数之和一个思路 只不过变成了三数之和等于tempTarget
            for (int i = k + 1; i < nums.length - 2; i++){
                if(i > k + 1 && nums[i] == nums[i - 1]){
                    continue;
                }
                left =  i + 1;
                right = nums.length - 1;
                while(left < right){
                    if(nums[i] + nums[left] + nums[right] == tempTarget){
                        List<Integer> temp = new ArrayList<Integer>();
                        temp.add(nums[k]);
                        temp.add(nums[i]);
                        temp.add(nums[left]);
                        temp.add(nums[right]);
                        result.add(temp);
                        while(left < right && nums[right] == nums[right - 1 ]){
                            right--;
                        }
                        while(left < right && nums[left] == nums[left + 1 ]){
                            left++;
                        }
                        right--;
                        left++;
                    }else if(nums[i] + nums[left] + nums[right] < tempTarget){
                        left++;
                    }else{
                        right--;
                    }
                }
            }
        }
        return result;
    }
}

标签:right,nums,int,训练营,随想录,++,第六天,length,left
From: https://www.cnblogs.com/Q316/p/17697635.html

相关文章

  • [代码随想录]Day42-动态规划part10
    题目:121.买卖股票的最佳时机思路:贪心做起来更简单;dp多此一举……状态0是有买入,状态1是代码:funcmaxProfit(prices[]int)int{lens:=len(prices)iflens==0{return0}dp:=make([][]int,lens)fori:=0;i<lens;i++{......
  • 代码随想录算法训练营第五天
    代码随想录算法训练营第五天|LeetCode242(有效的字母异位词)LeetCode349(两个数组的交集)LeetCode202(快乐数)LeetCode1(两数之和)242:有效的字母异位词LeetCode242(有效的字母异位词)classSolution{publicbooleanisAnagram(Strings,Stringt){......
  • 代码随想录:● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98
     654.最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个......
  • 【腾讯云 Cloud Studio 实战训练营】 - 云IDE编程之旅化繁为简
    csdn首发文章链接一、前言:随着云计算产业的发展,各种基于云端的IDE相继出现。相比于传统的IDE,云端IDE可以更大程度的提升用户工作的效率。腾讯云与国内领先的一站式软件研发平台CODING联合推出一款完全基于云端的IDE:CloudStudio。作为一款在线云端开发工具,它可以帮助用户减......
  • 代码随想录算法训练营-回溯算法|491.递增子序列
    491. 递增子序列 不对原数组进行排序,利用set对同层的子集进行去重。1classSolution:2deffindSubsequences(self,nums):3result=[]4path=[]5self.backtracking(nums,0,path,result)6returnresult78......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点, 19.删除链表的倒数第N个结点
    24.两两交换链表中的节点mydemo(超时)/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,Lis......
  • 代码随想录算法训练营第三天| 203.移除链表元素 707.设计链表 206.反转链表
    203.移除链表元素链表定义structListNode{intval;ListNode*next;ListNode():val(0),next(NULL){};ListNode(intx):val(x),next(NULL){};ListNode(intx,ListNode*next):val(x),next(next){};}1.在原链表上移除链表元素classSolut......
  • [代码随想录]Day40-动态规划part08
    题目:139.单词拆分思路:单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包!动规五部曲分析如下:确定dp数组以及下标的含义:dp[i]:字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字......
  • 代码随想录刷题记录——栈与队列篇
    栈与队列理论基础 栈stack:先进后厨队列queue:先进先出STL(C++标准库)STL栈和队列属于容器适配器(containeradapter)优先队列priority_queue:默认大根堆,如果是pair<a,b>,默认比较a大小如果需要比较b大小,且小根堆,可以如下实现232.用栈实现队列题目链接 pop操作时,当......
  • 2023牛客暑期多校训练营4
    A.BoboStringConstruction题意:给定一个01串t,构造一个长度为n的01串s,时的t+s+t中t只在首和尾出现。分析:结论,s取全0或者全1。①假设t全0或者全1,那我s和t取相反的即可。②假设t既包含0又包含1,首先t不可能是s的子串,那我们只需考虑t是否可以由t的后缀加上s再加上t的前缀得......