寒假刷题打卡第十八天 | 数组和矩阵

  1. 将数组0元素后移
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;
    }
};
  1. 改变矩阵维度
    思路一:把二维数组转换为一维数组,再把一维数组转化为二维数组。
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. 最大连续 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;
            
    }
};
  1. 有序矩阵查找
    剑指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);
    }
};
  1. 有序矩阵中的Kth
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;
    }
}; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值