目录
参考了很多大佬的题解,仅作为自己学习笔记用。
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
输出: