classSolution{publicint[]productExceptSelf(int[] nums){// 前缀积和后缀积int[] pre =newint[nums.length];pre[0]=1;for(int i =1; i < nums.length; i++){pre[i]= pre[i-1]* nums[i-1];}int[] after =newint[nums.length];after[nums.length-1]=1;for(int i = nums.length-2; i >=0; i--){after[i]= after[i+1]* nums[i+1];}int[] res =newint[nums.length];for(int i =0; i < nums.length; i++){res[i]= pre[i]* after[i];}return res;}}
7.缺失的第一个正数
考察交换元素 把数字3放到下标为2的数组中 nums[i] = nums[nums[i]-1]
classSolution{publicintfirstMissingPositive(int[] nums){// 3在下标为2的地方for(int i =0; i < nums.length; i++){while(nums[i]>0&& nums[i]<= nums.length && nums[i]!= nums[nums[i]-1]){int temp = nums[nums[i]-1];nums[nums[i]-1]= nums[i];nums[i]= temp;}}for(int i =0; i < nums.length; i++){if(nums[i]!= i+1){return i +1;}}return nums.length+1;}}
8.矩阵置零
考察矩阵 0行和零列需要单独处理
classSolution{publicvoidsetZeroes(int[][] matrix){int m = matrix.length;int n = matrix[0].length;boolean rowZero =false;boolean colZero =false;for(int i =0; i < m; i++){for(int j =0; j < n; j++){if(matrix[i][j]==0){matrix[i][0]=0;matrix[0][j]=0;// 必须放在这里,否则会受到上述两行的干扰if(i ==0) rowZero =true;if(j ==0) colZero =true;}}}// 处理非零行和列for(int i =1; i < m; i++){for(int j =1; j < n; j++){if(matrix[i][0]==0|| matrix[0][j]==0){matrix[i][j]=0;}}}if(rowZero ==true){for(int i =0; i < n; i++){matrix[0][i]=0;}}if(colZero ==true){for(int i =0; i < m; i++){matrix[i][0]=0;}}}}
9.螺旋矩阵
考察矩阵边界 注意结束一次循环就要立马判断
classSolution{publicList<Integer>spiralOrder(int[][] matrix){int m = matrix.length;int n = matrix[0].length;List<Integer> res =newArrayList<>();int left =0, right = n-1, top =0, bottom = m-1;while(true){if(left > right || top > bottom){break;}for(int i = left; i <= right; i++){res.add(matrix[top][i]);}if(++top > bottom)break;for(int i = top; i <= bottom; i++){res.add(matrix[i][right]);}if(--right < left)break;for(int i = right; i >= left; i--){res.add(matrix[bottom][i]);}if(--bottom < top)break;for(int i = bottom; i >= top; i--){res.add(matrix[i][left]);}if(++left > right)break;}return res;}}
10.旋转图像
考察矩阵旋转90°=对角线翻转+中线翻转
classSolution{publicvoidrotate(int[][] matrix){// 对角线翻转+中线翻转=顺时针旋转90°int m = matrix.length;int n = matrix[0].length;for(int i =0; i < m; i++){for(int j =0; j < i; j++){int temp = matrix[i][j];matrix[i][j]= matrix[j][i];matrix[j][i]= temp;}}for(int i =0; i < m; i++){for(int j =0; j < n /2; j++){int temp = matrix[i][j];matrix[i][j]= matrix[i][n-j-1];matrix[i][n-j-1]= temp;}}}}