首页 > 其他分享 >leetcode2397. 被列覆盖的最多行数 回溯法/枝剪

leetcode2397. 被列覆盖的最多行数 回溯法/枝剪

时间:2024-03-11 17:34:55浏览次数:25  
标签:numSelect matrix int stateSet leetcode2397 回溯 被列 currentState

第一次手搓一个回溯法,超时后采用枝剪勉强通过

class Solution {
    int max=0;
    int numSelect;
    public int maximumRows(int[][] matrix, int numSelect) {
        Set<String>stateSet=new HashSet<>();
        dfs(matrix,new boolean[matrix[0].length],0,numSelect,stateSet);
        return max;
    }
    public void dfs(int[][]matrix,boolean[]selected,int step,int numSelect,Set<String>stateSet){
        String currentState = Arrays.toString(selected);
        if (stateSet.contains(currentState))
            return;
        else
            stateSet.add(currentState);
    
        if(step==numSelect){
            int cnt=0;
            for(int i=0;i<matrix.length;i++){
                boolean flag=true;
                for(int j=0;j<matrix[0].length;j++){
                    if(matrix[i][j]!=0&&!selected[j]){
                        flag=false;
                        break;
                    }
                }
                if(flag)
                    cnt++;
            }
            max=Math.max(max,cnt);
                return;
        }
        for(int i=0;i<selected.length;i++){
                if(!selected[i]){
                    selected[i]=true;
                    dfs(matrix,selected,step+1,numSelect,stateSet);
                    selected[i]=false;
                }
        }
    }
}

 

标签:numSelect,matrix,int,stateSet,leetcode2397,回溯,被列,currentState
From: https://www.cnblogs.com/kun1790051360/p/18066635

相关文章

  • 【力扣】排列问题(回溯法)
    问题描述排列问题的难点在于排列要求有序,并且在写的时候发现,如何在选择后面的元素后回过头去选择前面的元素,这是很难处理的,在前面的组合问题中,我们都是用startindex来处理,而在这里就行不通了。容易想到的一种解决方法就是另外设置一个与nums长度相同的used数组来记录元素的遍历......
  • 【力扣】子集II(回溯法)(排序函数的一种隐藏用法?)
    题目描述可以套回溯模版的题,但是在写的过程中发现,如果数组中有多个相同元素分散存在的话,就会有一些子集无法得到像这里的1,4,4,如果对数组从左到右枚举的话是无论如何都得不到的。对这样的数组使用排序函数后,造成的效果就是相同的元素都堆在了一起,这样就能正确地得到所有子集......
  • 【力扣】复原IP地址(回溯法)(分割问题)
    问题描述在这个题中,因为结果的数据类型为vector<string>所以直接在s中添加分割点比较方便,先看一下代码:classSolution{private:vector<string>result;//记录结果//startIndex:搜索的起始位置,pointNum:添加逗点的数量voidbacktracking(string&s,intst......
  • 力扣回溯之 39. 组合总和
    //剪枝优化classSolution{  publicList<List<Integer>>combinationSum(int[]candidates,inttarget){    List<List<Integer>>res=newArrayList<>();    List<Integer>path=newArrayList<>();    A......
  • 【力扣】组合总数(回溯法)
    题目描述#include<iostream>#include<vector>usingnamespacestd;vector<vector<int>>res;vector<int>path;intaccumulate(vector<int>path){ intsum; for(inti=0;i<path.size();i++){ sum+=path[i]; } r......
  • 【力扣】电话号码的组合(回溯法)
    问题描述classSolution{public:vector<string>res;stringpath;//charA[26]={'a','b','c','d','e','f','g',//'h','i','j','k&......
  • 【力扣】求组合(回溯算法)
    题目描述2.以下是回溯算法的模版classSolution{private:vector<vector<int>>res;vector<int>path;//这个变量名还是设为path更合适voidbacktrace(intn,intk,intstartindex){//递归结束条件,这个是根据问题要求修改的if(path.s......
  • 代码随想录算法训练营第三十天|回溯法总结
    回溯法总结回溯算法能解决如下问题:组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等代码随想录(programmerc......
  • 回溯
    13.1回溯算法「回溯算法backtrackingalgorithm」是一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或者尝试了所有可能的选择都无法找到解为止。回溯算法通常采用“深度优先搜索”来遍历解空......
  • 回溯
    回溯算法理论基础题目分类理论基础什么是回溯法回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯。回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指......