天津中小企业网站制作/百度关键词seo年度费用

天津中小企业网站制作,百度关键词seo年度费用,资讯是做网站还是公众号,微官网系统架构1、题目描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1…

1、题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

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

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

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

示例 2:

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

2、代码实现

会超时的代码

class Solution
{
public:int findKthLargest(vector<int>& nums, int k){int target = k - 1;int left = 0, right = nums.size() - 1;while (left <= right) {int pos = partition(nums, left, right);if (pos == target) {return nums[pos];}else if (pos < target) {left = pos + 1;}else {right = pos - 1;}}return -1;}int partition(vector<int>& nums, int left, int right){static bool initSrand = false;if (!initSrand) {srand(time(0));}int pivot_index = left + (rand() % (right - left + 1));int pivot = nums[pivot_index];swap(nums[right], nums[pivot_index]);int i = left - 1;int j;for (j = left; j < right; j++) {if (nums[j] > pivot) {swap(nums[j], nums[++i]);}}swap(nums[++i], nums[right]);return i;}
};

正确的代码

#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <tuple>
#include <vector>using namespace std;class Solution {
public:/*** @brief 在未排序数组中找到第k大的元素(基于三向切分的快速选择算法)* @param nums 待搜索的整数数组* @param k 目标元素的排序位置(第k大)* @return 第k大的元素值* * @note 时间复杂度:平均O(n),最坏O(n²)(但概率极低)* @note 空间复杂度:O(1) 原地操作*/int findKthLargest(vector<int>& nums, int k) {int left = 0, right = nums.size() - 1;  // 当前搜索范围while (true) {// 随机选择基准值避免最坏情况int pivot_idx = left + rand() % (right - left + 1);int pivot = nums[pivot_idx];// 三向切分数组(大于区|等于区|小于区)auto [greater_end, less_start] = threeWayPartition(nums, left, right, pivot);// 计算各区域元素数量int greater_cnt = greater_end - left;      // 大于区的元素数量int equal_cnt = less_start - greater_end + 1; // 等于区的元素数量/* 决策树 */if (k <= greater_cnt) {          // 目标在大于区right = greater_end - 1;    // 缩小搜索范围到左区} else if (k <= greater_cnt + equal_cnt) { // 命中等于区return pivot;               // 直接返回结果} else {                        // 目标在小于区k -= (greater_cnt + equal_cnt); // 调整k的相对位置left = less_start + 1;      // 缩小搜索范围到右区}}}private:/*** @brief 三向切分数组* @param nums 待切分数组* @param left 当前处理区间的左边界* @param right 当前处理区间的右边界* @param pivot 基准值* @return tuple<int, int> 返回两个边界位置:*         - greater_end: 大于区的结束位置(最后一个大于元素的下一位置)*         - less_start: 小于区的开始位置(第一个小于元素的前一位置)* * @note 切分结果:*        [left, greater_end)    > pivot*        [greater_end, less_start] == pivot*        (less_start, right]    < pivot*/tuple<int, int> threeWayPartition(vector<int>& nums, int left, int right, int pivot)                 {int greater_end = left;   // 大于区的右边界(左侧元素均>pivot)int less_start = right;   // 小于区的左边界(右侧元素均<pivot)int i = left;             // 当前扫描指针while (i <= less_start) { // 扫描未处理区域if (nums[i] > pivot) {// 将大元素交换到大于区末尾swap(nums[i++], nums[greater_end++]);} else if (nums[i] == pivot) {// 等于元素直接跳过++i;} else {// 将小元素交换到小于区头部(注意i不递增)swap(nums[i], nums[less_start--]);}}return {greater_end, less_start};}
};

3、解题思路

这道题的难度很高,我最开始是采用普通的快速选择,虽然答案是对的,但是会超时,所以我们该用三向切分策略,也就是将数组分为[left, greater_end)、[greater_end, less_start]、(less_start, right] 三个区间,不过需要注意一下开闭区间。

核心思想
  1. 随机化基准值
    每次随机选择基准值 (pivot),有效避免输入数据有序导致的 O(n²) 最坏时间复杂度。

  2. 三向切分 (3-Way Partition)
    将数组划分为三个区域:

    • 大于区:所有元素 > pivot
    • 等于区:所有元素 == pivot
    • 小于区:所有元素 < pivot
  3. 递归决策
    根据各区域元素数量与k值的关系,决定后续搜索方向:

    • 若k在 ​大于区:缩小范围到左区间
    • 若k在 ​等于区:直接返回pivot
    • 若k在 ​小于区:调整k值后搜索右区间
执行流程
  1. 初始化搜索范围
    初始处理整个数组 (left=0, right=n-1)

  2. 随机选择基准值
    在 [left, right] 区间随机选取一个元素作为基准值,确保算法鲁棒性

  3. 三向切分操作

    • 使用三个指针:
      • greater_end:标记大于区的右边界
      • less_start:标记小于区的左边界
      • i:当前扫描指针
    • 扫描过程:
      • 大元素 → 交换到大于区末尾,指针右移
      • 等于元素 → 跳过
      • 小元素 → 交换到小于区头部,指针不动(需重新检查)
  4. 决策逻辑

if (k <= greater_cnt) {          // 目标在左区
    right = greater_end - 1;    
} else if (k <= greater_cnt + equal_cnt) { // 命中等于区
    return pivot;               
} else {                        // 目标在右区
    k -= (greater_cnt + equal_cnt); 
    left = less_start + 1;      
}

常见疑问解答
  1. 为什么用随机pivot?

    • 避免最坏时间复杂度,保证算法平均性能
  2. less_start指针为何不递增i?

    • 交换后的元素来自未处理区域,需重新判断其值
  3. 如何处理重复元素?

    • 三向分区将相同元素集中在中间区域,减少无效比较

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

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

相关文章

分布式光伏防逆流管理:技术要点与实践解析

在国家“双碳”目标推动下&#xff0c;分布式光伏作为新能源体系的重要组成部分&#xff0c;正迎来快速发展。国家能源局近期发布的《关于做好新能源消纳工作保障新能源高质量发展的通知》明确提出&#xff0c;需加强网源协调与调节能力&#xff0c;优化新能源利用率。其中&…

【CSS】CSS 使用全教程

CSS 使用全教程 介绍 CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种样式表语言&#xff0c;用于描述 HTML 或 XML 文档的布局和外观&#xff0c;它允许开发者将文档的内容结构与样式表现分离&#xff0c;通过定义一系列的样式规则来控制网页…

EasyRTC轻量级Webrtc音视频通话SDK,助力带屏IPC在嵌入式设备中的应用

一、市场背景 随着人们生活水平的提高&#xff0c;对于家居安全和远程监控的需求日益增长&#xff0c;带屏IPCam不仅满足了用户实时查看监控画面的需求&#xff0c;还提供了诸如双向语音通话、智能报警等丰富的功能&#xff0c;极大地提升了用户体验。 此外&#xff0c;技术的…

AI编辑器-Trae 玩转AI 编程

参考 掘金社区地址 Trae下载地址 管理插件 Trae 从入门到实践:AI 编码的妙笔生花 掘金社区 掘金社区简介 掘金是面向全球中文开发者的技术内容分享与交流平台。我们通过技术文章、沸点、课程、直播等产品和服务,打造一个激发开发者创作灵感,激励开发者沉淀分享,陪伴开发者…

C++《红黑树》

在之前的篇章当中我们已经了解了基于二叉搜索树的AVL树&#xff0c;那么接下来在本篇当中将继续来学习另一种基于二叉搜索树的树状结构——红黑树&#xff0c;在此和之前学习AVL树类似还是通过先了解红黑树是什么以及红黑树的结构特点&#xff0c;接下来在试着实现红黑树的结构…

【第23节】windows网络编程模型(WSAEventSelect模型)

目录 引言 一、WSAEventSelect模型概述 二、 WSAEventSelect模型的实现流程 2.1 创建一个事件对象&#xff0c;注册网络事件 2.2 等待网络事件发生 2.3 获取网络事件 2.4 手动设置信号量和释放资源 三、 WSAEventSelect模型伪代码示例 四、完整实践示例代码 引言 在网…

手撕算法——链表

算法基础——链表-CSDN博客 一、排队顺序 题⽬来源&#xff1a;洛⾕ 题⽬链接&#xff1a;B3630 排队顺序 - 洛谷 难度系数&#xff1a;★ 1. 题目描述 2. 算法原理 本题相当于告诉了我们每⼀个点的后继&#xff0c;使⽤静态链表的存储⽅式能够很好的还原这个队列。 数组中 [1,…

RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback

本文将介绍一种有反馈循环机制的RAG系统,让当AI学会"吃一堑长一智",给传统RAG装了个"后悔"系统,让AI能记住哪些回答被用户点赞/拍砖,从此告别金鱼记忆: 每次回答都像在玩roguelike:失败结局会强化下次冒险悄悄把优质问答变成新知识卡牌,实现"以…

使用cursor开发java案例——springboot整合elasticsearch

安装elasticsearch 打开cursor&#xff0c;输入如下提示词 使用springboot整合elasticsearch。其中elasticsearch服务器ip&#xff1a;192.168.236.134 管理员用户名elastic 管理员密码 PdQy_xfR2yLhpok*MK_ 监听端口9200点Accept all 使用idea打开生成的项目 &#xff0…

vue3 项目的最新eslint9 + prettier 配置

注意&#xff1a;eslint目前升级到9版本了 在 ESLint v9 中&#xff0c;配置文件已经从 .eslintrc 迁移到了 eslint.config.js 配置的方式和之前的方式不太一样了&#xff01;&#xff01;&#xff01;&#xff01; 详见自己的语雀文档&#xff1a;5、新版eslint9prettier 配…

基于FPGA的16QAM+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 16QAM调制解调原理 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 设置SNR12db 将FPGA数据导入到MATLAB显…

[学成在线]06-视频分片上传

上传视频 需求分析 教学机构人员进入媒资管理列表查询自己上传的媒资文件。 点击“媒资管理” 进入媒资管理列表页面查询本机构上传的媒资文件。 教育机构用户在"媒资管理"页面中点击 "上传视频" 按钮。 点击“上传视频”打开上传页面 选择要上传的文件…

Maven安装与环境配置

首先我们先介绍一些关于Maven的知识&#xff0c;如果着急直接看下面的安装教程。 目录 Maven介绍 Maven模型 Maven仓库 Maven安装 下载 安装步骤 Maven介绍 Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型(Project Object Model , 简称: POM)的概念…

AI Tokenization

AI Tokenization 人工智能分词初步了解 类似现在这个&#xff0c;一格子 一格子&#xff0c;拼接出来的&#xff0c;一行或者一句&#xff0c;像不像&#xff0c;我们人类思考的时候组装出来的话&#xff0c;并用嘴说出来了呢。

React(四)setState原理-性能优化-ref

setState详解 实现原理 开发中我们并不能直接修改State来重新渲染界面&#xff1a; 因为修改State之后&#xff0c;希望React根据最新的State来重新渲染界面&#xff0c;但这种方式的修改React并不知道数据发生了变化&#xff1b; React并没有类似于Vue2中的Object.defineP…

SSH密钥认证 + 文件系统权限控制 + Git仓库配置+封存与解封GIT仓库

在本地服务器上实现多个用户仅通过git push操作修改仓库、禁止其他改写方式的需求&#xff0c;可以通过以下步骤实现&#xff1a; 方法概述 通过SSH密钥认证 文件系统权限控制 Git仓库配置&#xff0c;确保用户仅能通过git push命令提交修改&#xff0c;而无法通过直接操作服…

C++11中智能指针的使用(shared_ptr、unique_ptr、weak_ptr)

C11中智能指针的使用(shared_ptr、unique_ptr、weak_ptr) 一、shared_ptr原理 shared_ptr 是另一种智能指针&#xff0c;用于实现多个 shared_ptr 实例共享同一个对象的所有权。它通过内部的控制块&#xff08;通常是一个包含计数器和指向对象的指针的结构&#xff09;来管理…

2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现&#xff1a; 人的大脑结构非常复杂&#xff0c;内部交织密布着神经和血管&#xff0c;所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术&#xff0c;通常需要…

尝试在软考62天前开始成为软件设计师-信息系统安全

安全属性 保密性:最小授权原则(能干活的最小权限)、防暴露(隐藏)、信息加密、物理保密完整性(防篡改):安全协议、校验码、密码校验、数字签名、公证 可用性:综合保障( IP过滤、业务流控制、路由选择控制、审计跟踪)不可抵赖性:数字签名 对称加密 DES :替换移位 3重DESAESR…

Rocky9.5基于sealos快速部署k8s集群

首先需要下载 Sealos 命令行工具&#xff0c;sealos 是一个简单的 Golang 二进制文件&#xff0c;可以安装在大多数 Linux 操作系统中。 以下是一些基本的安装要求&#xff1a; 每个集群节点应该有不同的主机名。主机名不要带下划线。 所有节点的时间需要同步。 需要在 K8s …