class Solution {
public:
void moveZeroes(vector<int>& nums) {
int placeOf1 = 0;
for(int x:nums)
{
if(x != 0)
{
nums[placeOf1] = x;
placeOf1++;
}
}
for(int i=placeOf1;i<nums.size();i++)
nums[i]=0;
}
};
- 改变矩阵维度
思路一:把二维数组转换为一维数组,再把一维数组转化为二维数组。
class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
if(nums.size()<=0)
return nums;
int rows = nums.size();
int cols = nums[0].size();
if(r*c > rows*cols)
return nums;
vector<int> oneDimVec;
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
oneDimVec.push_back(nums[i][j]);
vector<vector<int>> ans;
for(int i=0; i<r; i++)
{
vector<int> v;
for(int j=0; j<c; j++)
{
cout << i*r + j << endl;
v.push_back(oneDimVec[i*c + j]);
}
ans.push_back(v);
}
return ans;
}
};
思路二:直接转化
class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
if(nums.size()<=0)
return nums;
int rows = nums.size();
int cols = nums[0].size();
if(r*c > rows*cols)
return nums;
vector<vector<int>> ans;
int place = 0;
for(int i=0; i<r; i++)
{
vector<int> v;
for(int j=0; j<c; j++)
{
int row = place / cols;
int col = place - row * cols;
v.push_back(nums[row][col]);
place++;
}
ans.push_back(v);
}
return ans;
}
};
- 最大连续 1 的个数
快慢指针。一次通过的感觉是有点爽。
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int slow =0, fast = 0;
int maxLen = 0;
while(slow<nums.size() && fast < nums.size())
{
while(slow < nums.size() && nums[slow]==0) //这个地方的写法我是想了好一会儿的
slow++;
fast = slow;
while(fast < nums.size() && nums[fast])
fast++;
maxLen = max(maxLen, fast-slow);
slow = fast;
}
return maxLen;
}
};
- 有序矩阵查找
剑指offer原题
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0)
return false;
int rows = matrix.size();
int cols = matrix[0].size();
return searchMatrix(matrix, rows, cols, 0, cols-1, target);
}
bool searchMatrix(vector<vector<int>>& matrix, int rows, int cols, int row, int col, int target)
{
if(row >= rows || col < 0)
return false;
if(matrix[row][col] == target)
return true;
else if(matrix[row][col] < target)
return searchMatrix(matrix, rows, cols, row+1, col, target);
else
return searchMatrix(matrix, rows, cols, row, col-1, target);
}
};
class Solution {
public:
bool check(vector<vector<int>>& matrix, int mid, int k, int n) {
int i = n - 1;
int j = 0;
int num = 0;
while (i >= 0 && j < n) {
if (matrix[i][j] <= mid) {
num += i + 1;
j++;
} else {
i--;
}
}
return num >= k;
}
int kthSmallest(vector<vector<int>>& matrix, int k) {
int n = matrix.size();
int left = matrix[0][0];
int right = matrix[n - 1][n - 1];
while (left < right) {
int mid = left + ((right - left) >> 1);
if (check(matrix, mid, k, n)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
};