hot100:数组——39、48

文章介绍了两个编程问题的解决方案:一是使用回溯法求解组合总和问题,通过对数组排序和递归回溯找到所有可能的加和路径;二是矩阵旋转,分别阐述了使用辅助数组、原地旋转以及两次反转的策略实现矩阵90度旋转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

39. 组合总和

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

48. 旋转图像

①使用辅助数组
规律:对于矩阵中第 i 行的第 j个元素,在旋转后,它出现在倒数第 i列的第 j 个位置。
我们将其翻译成代码。由于矩阵中的行列从 0 开始计数,因此对于矩阵中的元素 matrix[row][col],在旋转后,它的新位置为 matrix[col][n−row−1]。

但是这样需要一个辅助数组来存储新的matrix,不然交换一次位置,matrix就会改变一次,不是在原有的matrix上进行变化,会出错

②原地旋转
根据前面得到的等式,推出,经过四次交换后,又回到了原来的位置。也就是可以一次性换四个位置的元素
注意:要弄清楚是谁替换谁

class Solution {
    public void rotate(int[][] matrix) {
        int n=matrix.length;
        for(int i=0;i<n/2;i++){//或者i<(n+1)/2, j<n也对
            for(int j=0;j<(n+1)/2;j++){
                int temp=matrix[i][j];
                matrix[i][j]=matrix[n-j-1][i];//不是matrix[i][j]=matrix[j][n-i-1]
                //因为是将matrix[i][j]移动到matrix[j][n-i-1]处,而不是将
                //matrix[j][n-i-1]移动到matrix[i][j]
                matrix[n-j-1][i]=matrix[n-i-1][n-j-1];
                matrix[n-i-1][n-j-1]=matrix[j][n-i-1];
                matrix[j][n-i-1]=temp;
            }
        }
        return;
    }
}

③使用反转的方法
先上下反转,然后沿主对角线反转

public void rotate(int[][] matrix) {
        int n=matrix.length;
        for(int i=0;i<n/2;i++){
            for(int j=0;j<n;j++){
                int temp=matrix[i][j];
                matrix[i][j]=matrix[n-i-1][j];
                matrix[n-i-1][j]=temp;
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){//注意n的范围,是到i
                int temp=matrix[i][j];
                matrix[i][j]=matrix[j][i];
                matrix[j][i]=temp;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值