LeetCode日记——数据结构数组与矩阵专题

Posted 菅兮徽音

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode日记——数据结构数组与矩阵专题相关的知识,希望对你有一定的参考价值。

  题1:移动0

LeetCode题号:283

难度:Easy

题目描述:

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

示例:

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

代码:

class Solution {
    public void moveZeroes(int[] nums) {
        int cnt = 0;
        for(int num:nums){
            if(num!=0){
                nums[cnt++]=num;
            }
        }
        while (cnt < nums.length) {
            nums[cnt++] = 0;
        }
    }
}

分析:

设置一个计数值cnt来统计数组中非0的元素的个数。

遍历整个数组,遇到不是0的数,就将nums[cnt]位置设为该数,然后计数值cnt++。

遍历完整个数组后,cnt即为非0元素的个数。然后我们从索引cnt开始(因为数组下标从0开始)把数组的后部分都设置为0即可。

 

  题2:重塑矩阵

LeetCode题号:556

难度:Easy

题目描述:

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

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

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

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

示例 1:

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

代码:

class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        int or = nums.length;
        int oc = nums[0].length;
        if(or*oc!=r*c) return nums;
        int[][] newnums = new int[r][c];
        int index = 0;
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                newnums[i][j] = nums[index / oc][index % oc];
                index++;
            }
        }
        return newnums;        
    }
}

分析:

核心在于,设置双重循环遍历新数组的每个位置,然后利用nums[index/oc][index%oc]为newnums[i][j]赋值。

 

以上是关于LeetCode日记——数据结构数组与矩阵专题的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode日记——算法双指针专题

LeetCode日记——算法贪心思想专题

Leetcode刷题日记精选例题(附代码及链接)

LeetCode日记——算法动态规划专题——斐波那契数列

498. 对角线遍历(LeetCode 华为专题)

动态规划专题2:矩阵的最小路径和