首页 > 编程语言 >代码随想录Day24|回溯算法+JAVA大作战

代码随想录Day24|回溯算法+JAVA大作战

时间:2023-06-17 21:01:52浏览次数:58  
标签:index JAVA int Day24 随想录 candidates ans return now

 今日任务

39. 组合总和

40.组合总和II

131.分割回文串

 93.复原IP地址 

 78.子集    90.子集II    
 

39. 组合总和

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    LinkedList<Integer> now_ans = new LinkedList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        combination(candidates, target, 0);
        return ans;
    }
    public void combination(int[] candidates, int target, int index){
        if(target == 0){
            ans.add(new ArrayList<Integer>(now_ans));
            return ;
        }
        if(candidates[index] > target) return;
        for(int i = index; i < candidates.length; i++){
            if (candidates[i] > target) break;
            now_ans.add(candidates[i]);
            combination(candidates, target-candidates[i], i);
            now_ans.removeLast();
        }
        return ;
    }
}

40.组合总和II

和上一题的不同在于这题需要去重复

如何在深度搜索的时候进行去重复呢?

在于每一层上的不重复行为

while(i > index && i < candidates.length && candidates[i] == candidates[i-1]) i++;
            if(i >= candidates.length) break;
            if(candidates[i] > target) break;

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    LinkedList<Integer> now_ans = new LinkedList<>();
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        combination(candidates, target, 0);
        return ans;
    }
    public void combination(int[] candidates, int target, int index){
        if(target == 0){
            ans.add(new ArrayList<>(now_ans));
            return;
        }
        if(index >= candidates.length || candidates[index] > target) return;
        for(int i = index; i < candidates.length; i++){
            while(i > index && i < candidates.length && candidates[i] == candidates[i-1]) i++;
            if(i >= candidates.length) break;
            if(candidates[i] > target) break;
            now_ans.add(candidates[i]);
            combination(candidates, target - candidates[i], i+1);
            now_ans.removeLast();
        }
        return;
    }
}

131.分割回文串

class Solution {
    List<List<String>> ans = new ArrayList<>();
    LinkedList<String> now_ans = new LinkedList<>();
    public List<List<String>> partition(String s) {
        combianation(s, 0);
        return ans;
    }
    public void combianation(String s, int index){
        if(index >= s.length()) {
            ans.add(new ArrayList<>(now_ans));
            return;
        }
        for(int i = index; i < s.length(); i++){
            if(ispalindrome(s, index, i)){
                now_ans.add(s.substring(index, i+1));
                combianation(s, i+1);
                now_ans.removeLast();
            }
        }
        return;
    }
    public Boolean ispalindrome(String s, int start, int end){
        while(start < end){
            if (s.charAt(start) != s.charAt(end)) return false;
            start++;
            end--;
        }
        return true;
    }
}

 

93.复原IP地址

细节真的超级多的一题

首先如果首位为0的话 only地址该位为0 就会成立

其次关于这题的数据结构知识的应用

对于我来说java的各种list的使用以及string的使用还是有些陌生

如何将我们的LinkedList转换为String

LinkedList的增删较为方便,使用add以及removeLast()

ArrayList的方便在于取值以及可以无限增加的大小 使用get进行取值

其次,还是要强调java的“”和‘’并不通用,String和char是不通用的,可以使用

""+s.charAt(index)进行转换

 

class Solution {
    List<String> ans = new ArrayList<String>();
    LinkedList<String> now_ans = new LinkedList<>();

    public List<String> restoreIpAddresses(String s) {
        if(s.length() < 4) return ans;
        combination(s,0,0);
        return ans;
    }

    public void combination(String s, int index, int num){
        if(index >= s.length() && num == 4){
            ArrayList<String> temp1 = new ArrayList<>(now_ans);
            String temp = temp1.get(0) + "." +  temp1.get(1) + '.' +  temp1.get(2) + '.' + temp1.get(3);
            ans.add(temp);
            return;
        }
        if(index >= s.length() || num >= 4) return;

        if(s.charAt(index) == '0'){
            now_ans.add(""+s.charAt(index));
            combination(s, index + 1, num + 1);
            now_ans.removeLast();
            return;
        }

        for(int i = 1; i <= 3; i++){
            if((i+index) > s.length()) break;
            String temp2 = s.substring(index, index + i);
            int temp3 = 0;
            for(int j = 0; j < i; j++) temp3 = temp3 * 10 + (temp2.charAt(j) - '0');
            if(temp3 <= 255) {
                now_ans.add(temp2);
                combination(s, index + i, num + 1);
                now_ans.removeLast();
            }
        }
        return;
    }
}

 


78.子集

如果把子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!

从这题开始回归python啦!!询问了老师的意见

JAVA在刷题中用到的在项目中

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        result = []
        path = []
        self.backtracking(nums, result, path, 0)
        return result
    
    def backtracking(self, nums, result, path, index):
        result.append(path[:])
        for i in range(index, len(nums)):
            path.append(nums[i])
            self.backtracking(nums, result, path, i+1)
            path.pop()

90.子集II

和上面的去重复方式一样,但是记住使用continue更稳妥

虽然我也不是很清楚不用continue多加一层while+break有什么错

记住需要sort.

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        result = []
        now_ans = []
        nums.sort()
        self.combination(nums,result, now_ans, 0)
        return result

    def combination(self, nums, result, now_ans, index):
        result.append(now_ans[:])
        for i in range(index, len(nums)):
            if i > index and nums[i] == nums[i-1]:
                continue
            now_ans.append(nums[i])
            self.combination(nums, result, now_ans, i+1)
            now_ans.pop()

        
        return 

 

 

 

 

 

标签:index,JAVA,int,Day24,随想录,candidates,ans,return,now
From: https://www.cnblogs.com/fangleSea/p/17488235.html

相关文章

  • Java对象拷贝MapStruct
    介绍编译期即可生成对象复制代码。简单理解,功能定位org.springframework.beans.BeanUtils。官网,GitHub-MapStruct。入门maven项目引入依赖:mapstruct:包含必要注解,如@Mappingmapstruct-processor:注解处理器,根据注解自动生成mapper实现<dependency><groupId>org.mapstruct</group......
  • Java基本概念
    1.Java发展历史由高斯林创建1995年由甲骨文公司收购并发出第一版本,目前使用最多是Java8及Java11原因是这两个版本都是长期支持维护的,企业用的也比较多。2.Java的一些特点跨平台性:主要是因为每个平台都装有JVMJava是一门解释语言,即由解释器解释完后,再通过JVM运行......
  • Java彩虹渐变算法
    彩虹渐变算法前言​ 最近有一个需求是需要一直去改变字体的颜色,然后我就想到了使用彩虹颜色作为字体颜色,使颜色按照彩虹颜色的顺序进行变化。​ 然后查了一下彩虹的颜色可以分为6种(对,不是七种),用RGB来表示分别是#FF00FF,#FFFF00,#00FF00,#00FFFF,#0000FF,#FF00FF,因此我们只需要......
  • 代码随想录day08
     第四章 字符串part01344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串344.反转字符串 classSolution{publicvoidreverseString(char[]s){//双指针法依次交换首尾两个fo......
  • java中 如何在文本中筛选出汉字
    在Java中,使用正则表达式来筛选出文本中的汉字。下面是一种方法:importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassMain{publicstaticvoidmain(String[]args){Stringtext="Hello你好!Thisisatest文本。";//使......
  • java中 如何在文本中筛选出汉字
    在Java中,使用正则表达式来筛选出文本中的汉字。下面是一种方法:importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassMain{publicstaticvoidmain(String[]args){Stringtext="Hello你好!Thisisatest文本。";//使......
  • java使double保留两位小数的多方法 java保留两位小数
    代码如下:mportjava.text.DecimalFormat;  DecimalFormat   df  =newDecimalFormat("######0.00");  doubled1=3.23456 doubled2=0.0;doubled3=2.0;df.format(d1);df.format(d2);df.format(d3);3个结果分别为:复制代码代码如下:3.230.002.00java保留两位小......
  • Java官方笔记11包
    PackagesDefinition:Apackageisagroupingofrelatedtypesprovidingaccessprotectionandnamespacemanagement.Notethattypesreferstoclasses,interfaces,enumerations,andannotationtypes.Enumerationsandannotationtypesarespecialkindsof......
  • java中 如何在文本中筛选出汉字
    在Java中,使用正则表达式来筛选出文本中的汉字。下面是一种方法:importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassMain{publicstaticvoidmain(String[]args){Stringtext="Hello你好!Thisisatest文本。";/......
  • java中 如何在文本中筛选出汉字
    在Java中,使用正则表达式来筛选出文本中的汉字。下面是一种方法:importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassMain{publicstaticvoidmain(String[]args){Stringtext="Hello你好!Thisisatest文本。";/......