408算法题leetcode--第24天

#378. 有序矩阵中第 K 小的元素

cpp 复制代码
class Solution {
public:
    int check(vector<vector<int>>& matrix, int target){
        // 找<=target的个数
        int count = 0;
        int n = matrix.size();
        // 每一列最后一个<=target的数
        int i = n - 1, j = 0;
        while(i >= 0 && j < n){
            if(matrix[i][j] <= target){
                // 第j列有i+1个元素<=target
                count += i + 1;
                ++j;
            } else {
                --i;
            }
        }
        return count;
    }
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        // 思路1:二维 > 一维,排序,输出第k个数
        // 优化:值二分,计算l与mid之间的元素个数,如果<k,说明target在右段,否则在左段
        // 每个数的范围都在[matrix[0][0], matrix[n-1][n-1]]之间,找到第一个满足左段有k-1个数的值
        int n = matrix.size();
        int l = matrix[0][0], r = matrix[n - 1][n - 1];
        while(l < r){
            int mid = l + (r - l) / 2;
            if(check(matrix, mid) < k){  // <=mid的个数<k
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l;
    }
};

1. 两数之和

  • 1. 两数之和
  • 思路1:暴力
  • 思路2:哈希表;时间和空间:O(n)
cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int>mp;  // val, index
        int size = nums.size();
        for(int i = 0; i < size; i++){
            int complement = target - nums[i];
            if(mp.find(complement) != mp.end()){
                return {mp[complement], i};
            }
            mp[nums[i]] = i;
        }
        return {};
    }
};
相关推荐
郝学胜-神的一滴2 小时前
Leetcode 969 煎饼排序✨:翻转间的数组排序艺术
数据结构·c++·算法·leetcode·面试
I_LPL9 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
颜酱9 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
WolfGang00732110 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
2401_8318249611 小时前
代码性能剖析工具
开发语言·c++·算法
Sunshine for you12 小时前
C++中的职责链模式实战
开发语言·c++·算法
qq_4160187212 小时前
C++中的状态模式
开发语言·c++·算法
2401_8845632412 小时前
模板代码生成工具
开发语言·c++·算法
2401_8319207413 小时前
C++代码国际化支持
开发语言·c++·算法
m0_6727033113 小时前
上机练习第51天
数据结构·c++·算法