小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Programming language
  4. Algorithm
  5. Leetcode
  6. 正文

Leetcode题目解析(191108):215及221

2019年11月8日 713点热度 0人点赞 0条评论

Leetcode 215:数组中的第K个最大元素

题目描述

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例

示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

解题思路

偷了个懒,就是利用求第k个小的数字改的。因为求第k个大的数字和求第m个小的数字有以下关系(假设数组长度为len):m=len-k+1,所以直接进行转换即可。

代码实现

int partition(vector<int>& nums, int left, int right)
{
    int start = left;
    int end = right;
    int poivt = nums[start];
    while (start < end)
    {
        while (start < end && nums[end] >= poivt)
            --end;
        nums[start] = nums[end];
        while (start < end && nums[start] < poivt)
            ++start;
        nums[end] = nums[start];
        nums[start] = poivt;
    }
    return start;
}

int findKthLargest(vector<int>& nums, int k) {
    int nlen = nums.size();
    int m = nlen-k+1;
    if (nlen < 1 || nlen < m)
    {
        return -1;
    }
    int start = 0;
    int end = nlen - 1;
    int target = 0;
    while (start <= end)
    {
        int mid = partition(nums, start, end);
        if (mid == m - 1)
        {
            target = nums[mid];
            break;
        }
        else if (mid > m - 1)
            end = mid;
        else
            start = mid + 1;
    }
    return target;
}

复杂度分析

时间复杂度:O(nlogn)

运行时间

Leetcode 221:最大正方形

题目描述

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例

输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4

解题思路

参考官方题解,步骤如下:

  1. 我们用 0 初始化另一个矩阵 dp,维数和原始矩阵维数相同;dp(i,j) 表示的是由 1 组成的最大正方形的边长。
  2. 从 (0,0)(0,0) 开始,对原始矩阵中的每一个 1,我们将当前元素的值更新为

dp(i, j)=min(dp(i−1, j), dp(i−1, j−1), dp(i, j−1))+1

  1. 我们用一个变量记录当前出现的最大边长,这样遍历一次就可以找到正方形的最大边长maxr,返回的结果就是maxr*maxr。

由于动态规划可以分解为若干个独立的子问题,由于一个格子的值受其左侧、左上角和上侧三个点来决定,所以我们以四个格子举例来解释这个式子,如下图所示。我们假设左下角的格子为最小值,那么有三种情况:

  1. 该值为0。则和前面组不成正方形,dp[i]=0+1=1。
  2. 该值为1。则其它值只能大于等于1,若都是等于1,说明周围三个小正方形没办法和其它正方形组成更大的正方形,所以只能它们4个组成。
  3. 该值为大于1的数,假设为2。则代表该蓝色格子与其左侧、左上侧、上侧组成了一个边长为2的正方形,由于黑色和绿色都大于2,所以黑色格子的左上角和上侧、绿色格子的上侧都不是0,于是就可以组成一个3*3的正方形,也即边长=2+1=3。其它大小以此类推。

状态图

上面的时间复杂度为O(mn),空间复杂度为O(mn)。接下来,我们可以对其进行优化。在上面的方法中,计算第i行的dp只用到了上一个元素和第i-1行,因此我们可以使用一维dp来满足要求。在扫描一行原始矩阵元素的时候,根据公式dp[j]=min(dp[j−1],dp[j],prev)来更新dp,其中prev是dp[j-1]。对于每一行,我们执行一遍过程,最后输出最大值即可。新的方法时间复杂度为O(mn),空间复杂度为O(n)。

代码实现

int min3(int a, int b, int c)
{
    return (a < b ? (a < c ? a : c) : (b < c ? b : c));
}

int maximalSquare(vector<vector<char>>& matrix) {
    if (matrix.empty())
        return 0;
    int rows = matrix.size();
    int cols = matrix[0].size();
    vector<int> dp(cols + 1, 0);
    int maxr = 0, prev = 0;
    for (int i = 1; i <= rows; i++)
    {
        for (int j = 1; j <= cols; j++)
        {
            int temp = dp[j];
            if (matrix[i - 1][j - 1] == '1')
            {
                dp[j] = min3(dp[j - 1], prev, dp[j]) + 1;
                maxr = max(maxr, dp[j]);
            }
            else
            {
                dp[j] = 0;
            }
            prev = temp;
        }
    }
    return maxr * maxr;
}

复杂度分析

时间复杂度为O(mn),空间复杂度为O(n)。

运行时间

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: leetcode
最后更新:2019年11月8日

davidcheung

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程小奥看房之鸿荣源珈誉府论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
吴恩达深度学习课程DeepLearning.ai笔记(4-3) 玩转你的Gravatar全球通用头像 编程知识点学习(1):字符串知识点 2015.3—2015.7的计划(证书考试)安排 Python chapter 6 learning notes 2010年8月3日-4日凌晨博客更新内容
标签聚合
Python linux 生活 Java 学习 鸟哥的linux私房菜 python学习 高中 算法 leetcode
最近评论
davidcheung 发布于 5 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 5 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 9 个月前(10月20日) :wink:
niming 发布于 10 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号