力扣刷题笔记26——最小的k个数/快速排序学习/快排与冒泡的时间复杂度

news2024/10/6 20:35:37

最小的k个数/快速排序学习/快排与冒泡的时间复杂度

  • 问题
  • 我的代码
  • 示例代码
  • 快速排序代码

问题

来自力扣:

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
 

限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000

我的代码


#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include<queue>
#include <typeinfo>
#include <numeric>
#include<cmath>
#include<map>
#include<string>
#include<stack>
#include<utility>

class Solution {
public:
	vector<int> getLeastNumbers(vector<int>& arr, int k) {
		if (arr.size() == 0 || k == 0) {
			//vector<int> tmp;
			return {};
		}
		int nsize = arr.size();
		sort(arr.begin(), arr.end());
		vector<int> tmp;
		for (int i = 0; i < k; ++i) {
			tmp.push_back(arr[i]);
		}
		return tmp;
	}
};
int main() {
	Solution myso;
	vector<int> arr = {1,2,3};
	vector<int> nums = myso.getLeastNumbers(arr,1);
	for (auto num : nums) {
		cout << num<<"\t";
	}

	return 0;
}

做法:先排序,后输出。我本来自己用冒泡排序实现排序的,但是提交后报错了,说超时。可能是因为冒泡排序是O( N 2 N^2 N2)的时间复杂度。用了sort函数后,就没有报错。查了下,好像复杂度低,只有O( N l o g 2 N Nlog_2N Nlog2N)。

示例代码

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        const int N=10005;
        vector<int> cnt(N);
        int mmax=-1;
        for(auto num:arr){
            cnt[num]+=1;
            mmax=max(mmax, num);
        }
        cnt.resize(mmax+1);
        vector<int> ans;
        ans.reserve(k);
        for(int i=0; k&&i<=N; i++){
            while(cnt[i]>0&&k){
                ans.push_back(i);
                k--;
                cnt[i]--;
            }
        }
        return ans;
    }
};

这个代码其实有点投机取巧,题目说值不会超过10000,所以它用了个数组,记录每种值出现了几次。然后把小的数值存进一个ans数组里,作为输出。这么做的好处就是,只需要对原数组进行一次循环遍历。坏处就是内存消耗较大。

快速排序代码

快速排序的思想:选定一个值p,然后把小于p的放v1,大于p的放v2。这样就得到了两个子数组v1和v2,其中v1的元素值都是小于v2。对v1再进行选值和排序,可以得到v1_1和v1_2。一直这样划分下去,就可以实现排序。
时间复杂度的证明看这个:快速排序时间复杂度分析
知乎有人给出了一个表格:
在这里插入图片描述
对于这道题,代码为这个:

class Solution {
    int partition(vector<int>& nums, int l, int r) {
        int pivot = nums[r];
        int i = l - 1;
        for (int j = l; j <= r - 1; ++j) {
            if (nums[j] <= pivot) {
                i = i + 1;
                swap(nums[i], nums[j]);
            }
        }
        swap(nums[i + 1], nums[r]);
        return i + 1;
    }

    // 基于随机的划分
    int randomized_partition(vector<int>& nums, int l, int r) {
        int i = rand() % (r - l + 1) + l;
        swap(nums[r], nums[i]);
        return partition(nums, l, r);
    }

    void randomized_selected(vector<int>& arr, int l, int r, int k) {
        if (l >= r) {
            return;
        }
        int pos = randomized_partition(arr, l, r);
        int num = pos - l + 1;
        if (k == num) {
            return;
        } else if (k < num) {
            randomized_selected(arr, l, pos - 1, k);
        } else {
            randomized_selected(arr, pos + 1, r, k - num);
        }
    }

public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        srand((unsigned)time(NULL));
        randomized_selected(arr, 0, (int)arr.size() - 1, k);
        vector<int> vec;
        for (int i = 0; i < k; ++i) {
            vec.push_back(arr[i]);
        }
        return vec;
    }
};

代码解析

  1. 它每次选择的p都是这段数组的最后一个值。分成v1和v2后,会返回一个位置索引pos,告知p的位置。
  2. 如果pos刚好等于k,说明v1刚好就是k个最小。
  3. 如果pos小于k,说明v1的个数小于k个,还得从v2中找出k-pos个。所以对v2进行快速排序,找出k-pos个。
  4. 如果pos大于k,说明v1的个数大于k个,得从v1中找出较小的k个。所以对v1进行快速排序,找出k个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1672_MIT 6.828 xv6中如何通过构建环境让系统中增加一个可执行调用文件

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面已经分析了如何实现一个系统调用&#xff0c;这个过程的梳理也已经整理成了一份学习笔记。这一次看一下&#xff0c;如何让OS的系统中增加这样的一个可执行的文…

10.网络爬虫—MongoDB详讲与实战

网络爬虫—MongoDB详讲与实战MongoDBMongoDB安装创建数据目录1.数据库操作2.集合操作3.文档操作4.索引操作5.聚合操作6.备份与恢复MongoDB增删改查mongodb集合的增删改查数据插入到表数据的查看删除数据更新数据PyMongo连接数据库第二步 选择需要使用的数据库和集合PyMongo增删…

公司分布式锁加锁错误原因

目录一、问题二、问题复现三、为什么产生这个错误四、解决方案一、问题 第一次设置锁成功, 但是返回false, 后续在循环获取的时候, 因为已经设置成功, 调用setIfAbsent不会返回true, 导致等锁3s失败 private boolean lockWait(String key, long wait, long expire) { long tot…

【CV】Latent diffusion model 扩散模型体验

note 文章目录note一、diffusion模型1.1 Stable Diffusion简介1.2 和GAN对比的优势二、Latent diffusion model原理2.1 潜在空间(Lantent Space)2.2 自动编码器和U-Net2.3 文本编码器三、代码实践3.1 模型权重checkpoints3.2 Stable Diffusion v1模型推理3.3 安装Stable Diffus…

再见了,我的C!

本人的第一篇博客发布于1月份&#xff0c;现在已经4月份了&#xff0c;历时3个月&#xff0c;&#xff0c;已经将C语言涵盖的大多数C语言知识点系统性的整理了出来&#xff0c;在这个期间自己收获了很多&#xff0c;这是C语言的最后一篇文章&#xff0c;接下来我们来回顾一下我…

13.Java面向对象----嵌套类

Java面向对象—嵌套类、内部类、匿名类 一、static静态 在《Java编程思想》有这样一段话&#xff1a;   “static方法就是没有this的方法。在static方法内部不能调用非静态方法&#xff0c;反过来是可以的。而且可以在没有创建任何对象的前提下&#xff0c;仅仅通过类本身来…

计及需求侧响应日前、日内两阶段鲁棒备用优化【IEEE6节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

3.3 二维随机变量条件分布

学习目标&#xff1a; 要学习二维随机变量的条件分布&#xff0c;我可能会采取以下步骤&#xff1a; 复习边缘分布和联合分布&#xff1a;首先需要了解二维随机变量的边缘分布和联合分布的概念以及相应的公式。 复习条件概率&#xff1a;学习条件概率的定义和计算公式&#x…

Java使用elasticjob实现定时任务(v2.1.5)

elastic是一个定时任务库 https://shardingsphere.apache.org/elasticjob/index_zh.html 项目结构 ​依赖 <dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-core</artifactId><version>2.1.5</version>&…

【linux】——进程和计划任务管理

文章目录1.进程 VS 线程1.1 程序和进程的关系1.2 线程1.3 进程和线程的关系2.查看进程2.1 查看进程信息ps2.2 查看进程信息top2.3 查看进程信息pgrep2.4 查看进程树pstree3.控制进程3.1 进程的启动方式3.2 进程的前后台调度3.3 终止进程的运行kill3.4 终止进程的运行pkill4.计划…

【华为OD机试】1039 - 迷宫问题

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1&#x1f538;样例2二、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &am…

CASA(Carnegie-Ames-Stanford Approach)模型应用

植被作为陆地生态系统的重要组成部分对于生态环境功能的维持具有关键作用。植被净初级生产力&#xff08;Net Primary Productivity, NPP&#xff09;是指单位面积上绿色植被在单位时间内由光合作用生产的有机质总量扣除自养呼吸的剩余部分。植被NPP是表征陆地生态系统功能及可…

全网最详细,Jmeter性能测试-性能基础详解,控制器不同选择(四)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 逻辑控制器 提前说…

机器学习实战:Python基于支持向量机SVM-RFE进行分类预测(三)

文章目录1 前言1.1 支持向量机的介绍1.2 支持向量机的应用2 demo数据集演示2.1 导入函数2.2 构建数据集拟合2.3 预测模型及可视化3 实例演示分类&#xff08;非SVM&#xff09;3.1 导入函数和数据3.2 简单线性分类3.3 最大间隔决定分类4 实例演示分类&#xff08;SVM&#xff0…

面试之Java的SPI机制详细讲解你会吗?

很多小伙伴对SPi不是很熟悉&#xff0c;今天我给大家详细讲解分享下&#xff1a; Java之SPI机制详细目录 1: SPI机制简介 2: SPI原理 3: 使用场景 4: 源码论证 5: 实战 6: 优缺点 6.1 优点 6.2 缺点 Java之SPI机制详解 1: SPI机制简介 SPI 全称是 Service Provider Interface…

Django整合mysqlclinet步骤

准备工作 要在 Django 中使用 MySQL 数据库&#xff0c;您需要完成以下步骤&#xff1a; 安装 MySQL 服务器和客户端。你可以从官方网站下载并安装&#xff1a;https://www.mysql.com/downloads/ 安装 mysqlclient。mysqlclient 是一个 Python 的第三方库&#xff0c;用于连接…

chapter-7数据库事务

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 DBMS保证系统中一切事务的原子性、一致性、隔离性和持续性 DBMS必须对事务故障、系统故障和介质故障进行恢复 恢复中最经常使用的技术&#xff1a;数据库转储和登记日志文件 恢复的基本原理&#…

十二、网络规划与设计

&#xff08;一&#xff09;网络设计基础 1、网络系统生命周期 &#xff08;1&#xff09;四阶段周期&#xff08;重叠&#xff09; 构思与规划阶段、分析与设计阶段、实施与构建阶段、运行与维护阶段 特点&#xff1a;能够快速适应新的需求变化&#xff0c;成本低&#xf…

【SQL 初阶教程】一文轻松玩转 SQL

目录 一、SQL 通用语法 二、SQL 语句的分类 三、DDL语句 DDL——数据库操作 查询所有数据库 语句&#xff1a; SHOW DATABASES;&#xff08;大小写均可&#xff0c;建议大写&#xff09; 创建数据库HSK 语句&#xff1a;CREATE DATABASE HSK; 删除数据库HSK 语句 &#…

关于本地git通过ssh链接github时 time out问题的解决方法

目录问题描述解决方法问题描述 我们如果想要用git ssh链接到远端github&#xff0c;进行repo的clone等操作时&#xff0c;会进行如下的操作&#xff1a; 首先在ssh端命令生成rsa秘钥&#xff0c;命令如下&#xff1a; ssh-keygen -t rsa -C “你的git绑定的邮箱名字”然后在g…