【Leetcode】Java:数组与矩阵

这篇博客整理了多个LeetCode中关于数组和矩阵的Java解题思路,包括移动零、重塑矩阵、最大连续1的个数等经典问题,通过详细题解和示例代码帮助读者理解和掌握相关算法。
摘要由CSDN通过智能技术生成


参考了很多大佬的题解,仅作为自己学习笔记用。


1、283.移动零

题意:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

题解:

从新下标 x=0 开始重新赋值,遍历数组,遇到非 0 元素值,就往下标 x 处赋值,且 x++,遍历结束,剩下的从下标 x 开始,赋值 0。

    public void moveZeroes(int[] nums) {
   
        int x = 0;                            // 新下标 0 开始
        for(int num : nums){
   
            if(num != 0)
                nums[x++] = num;
        }

        for(int i = x; i < nums.length; i++)      // 后面剩余的补 0
            nums[i] = 0;
    }

2、566.重塑矩阵

题意:

在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。

给出一个由二维数组表示的矩阵,以及两个正整数 r 和 c,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

输入: 
nums = [[1,2],
 		[3,4]]
r = 1, c = 4

输出: [[1,2,3,4]]
解释:行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。
-------------------------------------------------------------------------------
输入: 
nums = [[1,2],
 		[3,4]]
r = 2, c = 4

输出: [[1,2],
	  [3,4]]
解释:没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵。

题解:

首先判断矩阵元素个数是否等于 r * c,如果不相等,返回原矩阵;相等就进行以下操作:
遍历原数组,取出元素值,赋值到新数组,先给定下标 y=0,赋值到新数组位置的行就是 y/c,列就是 y%c,递增 y 即可。

    public int[][] matrixReshape(int[][] nums, int r, int c) {
   
        int m = nums.length, n = nums[0].length;
        if( m * n != r * c)
            return nums;

        int[][] res = new int[r][c];
        int y = 0;
        for(int i = 0; i < m; i++){
                // 遍历原数组,其实也可以遍历新数组,笔者可以尝试
            for(int j = 0; j < n; j++){
            
                res[y / c][y % c] = nums[i][j];
                y++;
            }
        }

        return res;
    }

3、485.最大连续1的个数

题意:

给定一个二进制数组, 计算其中最大连续1的个数。

输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续 1,所以最大连续 1 的个数是 3.

题解:

count 记录当前计算的 1 的长度,max 存放到目前为止最长的 1 的个数。遇到 0,max 就为 max 和 count 较大者。

    public int findMaxConsecutiveOnes(int[] nums) {
   
        int count = 0, max = 0;
        
        for(int i = 0; i< nums.length; i++){
   
            if(nums[i] == 1){
   
                count++;
            }else {
   
                max = Math.max(max, count);
                count = 0;
            }
        }
        return Math.max(max, count);
    }

可以利用三目运算符合并。

	public int findMaxConsecutiveOnes(int[] nums) {
   
	    int max = 0, count = 0;
	    for (int num : nums) {
   
	        count = num == 0 ? 0 : count + 1;
	        max = Math.max(max, count);
	    }
	    return max;
	}

4、240.有序二维矩阵查找

题意:

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

输入:
matrix = [[ 1, 4, 7, 11, 15],
		  [ 2, 5, 8, 12, 19],
		  [ 3, 6, 9, 16, 22],
		  [10,13,14, 17, 24],
		  [18,21,23, 26, 30]]
target = 5

输出:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值