首页 > 其他分享 >周日

周日

时间:2023-05-21 18:11:41浏览次数:32  
标签:index right nums int pivot 周日 left

题目描述:

给定一个整数数组 nums,找到其中第 k 大的元素。注意,这里的第 k 大的元素指的是排序后第 k 大的元素,而不是第 k 个不同的元素。

示例:

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

设计思路:

该问题可以使用快速选择算法(QuickSelect Algorithm)来解决,快速选择是一种选择性能比概率选择更好的算法。

和快速排序思路类似,快速选择采用了分治法的思想,不过快速选择只需要对需要处理的数据进行一次划分,并接着选取其中的一部分继续处理。快速选择每次划分的时候都会把小于 pivot 的数放到 pivot 左边,大于等于 pivot 的数放在 pivot 右边,从而实现缩小问题规模的效果。

程序流程图:

开始
1. 进入快速选择函数
2. 选取 pivot 元素并将整个数组按照大小关系分为两部分
3. 如果 k 落在右半部分,继续对右半部分进行快速选择
   否则,继续对左半部分进行快速选择
4. 返回结果
结束

代码实现:

#include <iostream>
#include <vector>

using namespace std;

int partition(vector<int>& nums, int left, int right) {
    int pivot = nums[right], i = left;
    for (int j = left; j < right; ++j) {
        if (nums[j] > pivot) {
            swap(nums[i], nums[j]);
            ++i;
        }
    }
    swap(nums[i], nums[right]);
    return i;
}

int quickSelect(vector<int>& nums, int left, int right, int k) {
    int index = partition(nums, left, right);
    if (index - left == k - 1) {
        return nums[index];
    } else if (index - left > k - 1) {
        return quickSelect(nums, left, index - 1, k);
    } else {
        return quickSelect(nums, index + 1, right, k - index + left - 1);
    }
}

int findKthLargest(vector<int>& nums, int k) {
    return quickSelect(nums, 0, nums.size() - 1, k);
}

int main() {
    vector<int> nums = {3, 2, 1, 5, 6, 4};
    int k = 2;
    int result = findKthLargest(nums, k);
    cout << result << endl;
    return 0;
}

标签:index,right,nums,int,pivot,周日,left
From: https://www.cnblogs.com/zeyangshuaige/p/17418932.html

相关文章

  • 2023年4月23日周日
    计划完成初稿最后一部分回顾这一周甚至更前的博客学习记录执行09点12分  开始写初稿15点56分  写了一天,没写完记录问题想法已解决增加了测试不通过的接口状态,以及测试不通过后发送邮件给接口开发人员修改了生成的word接口文档的样式接口审核通过后发送邮件给......
  • 周日攻略
    攻略一:上海电影博物馆,主题电影电视剧的发展,徐汇区。可以下午3点到,稍微转一个多小时,然后再附近吃个饭。携程简介:https://you.ctrip.com/sight/shanghai2/110776.html  攻略二上海长风海洋世界,主题海洋生物,普陀区,13号线,15号线。可以下午3点到,稍微转一个多小时,然后再附近吃......
  • js 计算时间范围的时间差(只计算工作日,不计算周六周日,精确到天)
    直接上demo代码和截图btnClick(){ varoneDay=1000*60*60*24; vardays=0; //dates是一个时间范围,startDate是时间范围的开始时间,endDate是结束时间 varstartDate=this.dates[0]; varendDate=this.dates[1]; if(endDate.getTime()>0&&startDate.g......
  • java vue获取当月第一天和最后一天,当前周一和周日
    1,vue前端,通过moment获取当月第一天和最后一天,当前周一和周日letcurrDate=moment(newDate(),"YYYY-MM-DD");varfirstDay=moment(currDate.startOf("month").valueOf()).format('YYYY-MM-DD');//获取该月份第一天的时间戳varendDay=moment(cur......
  • 周日太累,影响到周一早上上班?
    周日晚上辅导孩子们学习,之前答应了一起帮另外两个孩子一起复习。答应了就要做哈。但是发现吼叫孩子真是耗费精力。回头想想也就那么点东西啊。。还有就是为啥觉得做饭收......
  • 【Java】取n工作日后的日期(仅排除周六周日)
    importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.time.*;importjava.time.format.DateTimeFormatter;importjava.util.Calendar;i......
  • 2023.1.15;周日复盘
    复盘目的:复习,简洁,高效想法做事情要考虑目的与后果这样提醒自己更专注当下的原本的事情,不被其他事情被打扰,不忘初心;做好做这件事情可能出现的所有结果的心理准备。To......
  • JS-获取每月有几周,根据年月周获取该周从周一到周日的日期等方法
    //获取每月有几周(注:从第一个周一开始算该月第一周)functiongetWeeks(year,month){vard=newDate();//该月第一天d.setFullYear(year,month-1,1......
  • 20221127周日Vue中message.split().reverse().join()函数用法
    Vue中message.split().reverse().join()函数用法 1、split('') 把一个字符串分割成字符串数组 把数据拆分为一个数组,括号里的''是把数据拆分为每个字符串2、r......
  • 11.13;周日;复盘
    复盘记录内容,回顾经验编程学习1.学习方法学习初期,用到啥学啥学习20%的功能即可,不必去深究啥火学啥对于作品,是先完成再完美(编程也是一样的)c语言理论知识指针......