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;
}
}
}