美文网首页
2020-07-21 旋转矩阵&&第k大

2020-07-21 旋转矩阵&&第k大

作者: nowherespyfly | 来源:发表于2020-08-15 14:13 被阅读0次

1. 旋转矩阵

边界条件比较难控制;还有一种做法是,先上下翻转,再沿对角线翻转。

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int N = matrix.size();
        if(N == 0)
            return;
        for(int i = 0; i < N / 2; i++){
            int last = N - i - 1;
            for(int j = i; j < last; j++){
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[N - j - 1][i];
                matrix[N - j- 1][i] = matrix[N - i - 1][N - j - 1];
                matrix[N - i - 1][N - j - 1] = matrix[j][N - i - 1];
                matrix[j][N - i - 1] = tmp;
            }
        }
    }
};

18 四数之和

跟三数之和一样的思路,设置pq分别为第一和第二个数,然后两个指针ij分别为q+1和N-1;外层循环为p,内层循环为q,双指针。需要注意重复的情况。

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;
        if(nums.size() < 4)
            return ret;
        sort(nums.begin(), nums.end());
        int p = 0;
        for(int p = 0; p < nums.size() - 3; p++){
            if(p >  0 && nums[p] == nums[p - 1])
                continue;
            for(int q = p + 1; q < nums.size() - 2; q++){
                if(q > p + 1 && nums[q] == nums[q - 1])
                    continue;
                int cur_sum = nums[p] + nums[q];
                int i = q + 1, j = nums.size() - 1;
                while(i < j){
                    int tmp = cur_sum + nums[i] + nums[j];
                    if(tmp == target){
                        vector<int> v = {nums[p], nums[q], nums[i], nums[j]};
                        ret.push_back(v);
                        i++;
                        j--;
                        while(i < j && nums[i] == nums[i - 1])
                            i++;
                        while(i < j && nums[j] == nums[j + 1])
                            j--;
                    }
                    else if(tmp < target){
                        i++;
                        while(i < j && nums[i] == nums[i - 1])
                            i++;
                    }
                    else{
                        j--;
                        while(i < j && nums[j] == nums[j + 1])
                            j--;
                    }
                }
            }
        }
        return ret;
    }
};

215 找到第k大的数

用快排的思想,每次选择区间内第一个元素作为pivot,将数组区间分为两部分。如果返回index<k,就搜索右边,否则,搜索左边。
写快排需要注意:mid和k的初始值,以及更新条件。mid初始值是left,k的初始值是left + 1;如果下一个扩展的元素比pivot大,就将左边的区间向右扩展,也就是交换mid和k的值;否则,只更新k。
搜索需要注意:单边搜索,O(logn)。

class Solution {
public:
    void swap(vector<int>& nums, int a, int b){
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
    int partition(vector<int>& nums, int left, int right){
        int pivot = nums[left];
        int mid = left;
        for(int k = left + 1; k <= right; k++){
            if(nums[k] > pivot){
                mid++;
                swap(nums, mid, k);
            }
        }
        swap(nums, mid, left);
        return mid;
    }
    int binaryFind(vector<int>& nums, int left, int right, int target){
        if(left == right){
            if(left == target - 1)
                return left;
            else return -1;
        }
        int p = partition(nums, left, right);
        if(p == target - 1)
            return p;
        if(target - 1 < p){
            int left_p = binaryFind(nums, left, p - 1, target);
            return left_p;
        }
        else{
            int right_p = binaryFind(nums, p + 1, right, target);
            return right_p;
        }
    }
    int findKthLargest(vector<int>& nums, int k) {
        int index = binaryFind(nums, 0, nums.size() - 1, k);
        return nums[k - 1];
    }
};

相关文章

  • 2020-07-21 旋转矩阵&&第k大

    1. 旋转矩阵 边界条件比较难控制;还有一种做法是,先上下翻转,再沿对角线翻转。 18 四数之和 跟三数之和一样的...

  • LeetCode 378 [Kth Smallest Sum i

    原题 在一个排序矩阵中找从小到大的第 k 个整数。排序矩阵的定义为:每一行递增,每一列也递增。 样例给出 k = ...

  • lintcode-排序矩阵中的从小到大第k个数

    在一个排序矩阵中找从小到大的第 k 个整数。排序矩阵的定义为:每一行递增,每一列也递增。样例给出 k = 4 和一...

  • 基本变换矩阵

    1 平移变换 平移矩阵 T 平移后的新点 2 旋转矩阵 旋转矩阵用、、 分别表示 对一个绕任意轴旋转角度的旋转矩阵...

  • 找到行列有序矩阵第K大的值

    问题描述 给定一个矩阵,矩阵的各行和各列都是递增的,找出第k大的元素。例如:1,2,8,92,4,9,124,7,...

  • Houdini 克服恐惧之 | Matrix到底是个什么东西?

    Rotational Matrix | 旋转矩阵 不管是旋转矩阵还是移动矩阵,首先Matrix本质上只是一个矩阵...

  • 12 - Hard - Kth Smallest Elemen

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素...

  • 有序矩阵中第K小的元素

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素...

  • 第四季 变换(二)

    0对于上篇旋转矩阵的扩充 如果我们有个旋转矩阵,旋转θ度,那矩阵如下 而如果我们旋转了 -θ度的话,由于三角函数 ...

  • OpenGL 图片翻转的5种策略

    iOS纹理翻转解决策略 第1种: 旋转矩阵翻转图形,不翻转纹理 让图形顶点坐标旋转180°. 而纹理保持原状. 第...

网友评论

      本文标题:2020-07-21 旋转矩阵&&第k大

      本文链接:https://www.haomeiwen.com/subject/xsqgkktx.html