vs2015可以做网站么,番禺建设网站服务,保险网站建设公司,电子商务都学什么832. 翻转图像
问题描述
给定一个 n x n 的二进制矩阵 image#xff0c;对其进行水平翻转后再对每个元素进行反转#xff08;0变1#xff0c;1变0#xff09;。
水平翻转#xff1a;将每一行的元素顺序颠倒 反转#xff1a;将每个 0 变为 1#xff0c;每个 1 变为 0 …832. 翻转图像问题描述给定一个n x n的二进制矩阵image对其进行水平翻转后再对每个元素进行反转0变11变0。水平翻转将每一行的元素顺序颠倒反转将每个 0 变为 1每个 1 变为 0要求原地修改矩阵并返回结果。示例输入:image[[1,1,0],[1,0,1],[0,0,0]]输出:[[1,0,0],[0,1,0],[1,1,1]]解释:-首先水平翻转每一行:[[0,1,1],[1,0,1],[0,0,0]]-然后反转每个元素:[[1,0,0],[0,1,0],[1,1,1]]输入:image[[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]输出:[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]算法思路双指针核心水平翻转 反转可以同时进行对于每一行使用双指针从两端向中间移动交换两个位置的元素时同时进行反转操作反转使用异或操作value ^ 1可以实现 0↔1 的翻转或者使用1 - value代码实现方法一双指针classSolution{/** * 翻转图像水平翻转每一行然后反转每个元素0变11变0 * 使用双指针原地操作时间复杂度O(n²)空间复杂度O(1) * * param image n x n 的二进制矩阵 * return 翻转后的图像 */publicint[][]flipAndInvertImage(int[][]image){intnimage.length;// 遍历每一行for(inti0;in;i){intleft0;// 左指针intrightn-1;// 右指针// 双指针向中间移动while(leftright){// 交换左右元素并同时反转// 使用异或操作进行反转0^11, 1^10inttempimage[i][left]^1;image[i][left]image[i][right]^1;image[i][right]temp;left;right--;}// 如果行长度为奇数处理中间元素只需反转if(leftright){image[i][left]^1;}}returnimage;}}方法二分步classSolution{/** * 分步实现先水平翻转再反转每个元素 * * param image 输入图像 * return 翻转后的图像 */publicint[][]flipAndInvertImage(int[][]image){intnimage.length;// 水平翻转每一行for(inti0;in;i){intleft0;intrightn-1;while(leftright){// 交换元素inttempimage[i][left];image[i][left]image[i][right];image[i][right]temp;left;right--;}}// 反转每个元素for(inti0;in;i){for(intj0;jn;j){image[i][j]^1;// 或者 image[i][j] 1 - image[i][j];}}returnimage;}}方法三使用额外空间classSolution{/** * 使用额外空间 * * param image 输入图像 * return 翻转后的图像 */publicint[][]flipAndInvertImage(int[][]image){intnimage.length;int[][]resultnewint[n][n];for(inti0;in;i){for(intj0;jn;j){// result[i][j] 反转(image[i][n-1-j])result[i][j]image[i][n-1-j]^1;}}returnresult;}}算法分析时间复杂度O(n²)需要处理矩阵中的每个元素一次双指针中每个元素只被访问一次空间复杂度O(1)原地修改只使用常数额外空间算法过程输入image [[1,1,0],[1,0,1],[0,0,0]]方法一处理第0行[1,1,0]left0, right2交换image[0][0]和image[0][2]并反转temp 1^1 0image[0][0] 0^1 1image[0][2] 0行变为[1,1,0]left1, right1中间元素image[0][1] ^ 1→1^1 0最终第0行[1,0,0]处理第1行[1,0,1]left0, right2交换并反转temp 1^1 0image[1][0] 1^1 0image[1][2] 0行变为[0,0,0]left1, right1中间元素image[1][1] ^ 1→0^1 1最终第1行[0,1,0]处理第2行[0,0,0]left0, right2交换并反转temp 0^1 1image[2][0] 0^1 1image[2][2] 1行变为[1,0,1]left1, right1中间元素image[2][1] ^ 1→0^1 1最终第2行[1,1,1]最终结果[[1,0,0],[0,1,0],[1,1,1]]测试用例importjava.util.Arrays;publicclassMain{publicstaticvoidmain(String[]args){SolutionsolutionnewSolution();// 测试用例1标准示例int[][]image1{{1,1,0},{1,0,1},{0,0,0}};int[][]result1solution.flipAndInvertImage(image1);System.out.println(Test 1: Arrays.deepToString(result1));// [[1,0,0],[0,1,0],[1,1,1]]// 测试用例24x4矩阵int[][]image2{{1,1,0,0},{1,0,0,1},{0,1,1,1},{1,0,1,0}};int[][]result2solution.flipAndInvertImage(image2);System.out.println(Test 2: Arrays.deepToString(result2));// [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]// 测试用例3全1矩阵int[][]image3{{1,1,1},{1,1,1},{1,1,1}};int[][]result3solution.flipAndInvertImage(image3);System.out.println(Test 3: Arrays.deepToString(result3));// [[0,0,0],[0,0,0],[0,0,0]]// 测试用例4全0矩阵int[][]image4{{0,0,0},{0,0,0},{0,0,0}};int[][]result4solution.flipAndInvertImage(image4);System.out.println(Test 4: Arrays.deepToString(result4));// [[1,1,1],[1,1,1],[1,1,1]]// 测试用例5单元素矩阵int[][]image5{{1}};int[][]result5solution.flipAndInvertImage(image5);System.out.println(Test 5: Arrays.deepToString(result5));// [[0]]int[][]image6{{0}};int[][]result6solution.flipAndInvertImage(image6);System.out.println(Test 6: Arrays.deepToString(result6));// [[1]]// 测试用例62x2矩阵int[][]image7{{1,0},{0,1}};int[][]result7solution.flipAndInvertImage(image7);System.out.println(Test 7: Arrays.deepToString(result7));// [[1,0],[0,1]]}}关键点原地操作双指针在交换的同时进行反转避免了两次遍历异或操作^ 1是最简洁的反转方式奇偶长度偶数长度所有元素都通过交换处理奇数长度中间元素单独处理只需反转无需交换位运算value ^ 1比1 - value更高效边界情况1x1 矩阵直接反转唯一元素全0或全1矩阵结果分别为全1或全0常见问题异或操作^ 1为什么能实现反转在二进制中011110正好实现了0和1的互换。