当前位置: 首页 > news >正文

沧州网站制作新网站怎么快速收录

沧州网站制作,新网站怎么快速收录,优化网站搭建,有哪些做的好看的网站吗题目链接:力扣 解题思路: 方法一:基于快速排序 因为题目中只需要找到第k大的元素,而快速排序中,每一趟排序都可以确定一个最终元素的位置。 当使用快速排序对数组进行降序排序时,那么如果有一趟排序过程…

题目链接:力扣

解题思路:

方法一:基于快速排序

因为题目中只需要找到第k大的元素,而快速排序中,每一趟排序都可以确定一个最终元素的位置。

当使用快速排序对数组进行降序排序时,那么如果有一趟排序过程中,确定元素的最终位置为k-1(索引从0开始),那么,该元素就是第k大的元素

具体思想下:

  1. 利用快排,对数组num[left,...,right]进行降序排序,在一趟排序过程中,可以确定一个元素的最终位置p,将数组划分为三部分,num[left,...,p-1],nums[p],nums[p+1,right],并且满足
    1. num[left,...,p-1] >= nums[p]
    2. num[p+1,right] <=nums[p]
    3. 即p位置以前的元素是数组中比p位置元素大的元素(此时p位置以前的元素不一定有序,但是肯定都大于等于p位置的元素),而num[p]是第p+1大的元素
  2. 因为需要找到的是第k大的元素:
    1. 如果k < p,那么第k大的元素肯定在num[left,...,p-1]内,这个时候只需要对右半部分区间进行快排
    2. 如果k > p,那么第k大的元素肯定在nums[p+1,right]区间内,这个时候只需要对左半部分区间进行快排
    3. 如果 p= k-1,那么nums[p]就是第k大的元素
  3. 注意这种方式并不要求最终数组中的元素有序,每次只会对左半部分或者右半部分进行快排,减少了一般的快排调用

AC代码:

class Solution {public static int findKthLargest(int[] nums, int k) {return quickSortFindK(nums, 0, nums.length - 1, k);}public static int quickSortFindK(int[] nums, int left, int right, int k) {//选取枢轴元素int pivot = nums[left];int low = left;int high = right;while (low < high) {while (low < high && nums[high] <= pivot)high--;nums[low] = nums[high];while (low < high && nums[low] >= pivot)low++;nums[high] = nums[low];}//low(或者right)就是这趟排序中枢轴元素的最终位置nums[low] = pivot;if (low == k - 1) {return pivot;} else if (low > k - 1) {return quickSortFindK(nums, left, low - 1, k);} else {return quickSortFindK(nums, low + 1, right, k);}}
}

 

快速排序的最好时间复杂度是O(nlogn),最坏时间复杂度为O(n^2),平均时间复杂度为O(nlogn)

快速排序在元素有序的情况下效率是最低。

不过可以通过在某些情况下,快速排序可以达到期望为线性的时间复杂度,即O(n),也就是在每次排序前随机的交换两个元素(个人理解可能是为了让元素变乱,不那么有序,越乱越快,算法导论中在9.2 期望为线性的选择算法进行了证明,还没有学习,先在此记录下),它的时间代价的期望是 O(n)

具体代码实现,就是在排序前,加上下面的代码

//随机生成一个位置,该位置的范围为[left,right]
//然后将该位置的元素与最后一个元素进行交换,让数组变得不那么有序,
//放置出现有序的情况下快排的时间复杂度退化为o(n^2)
int randomIndex = random.nextInt(right - left + 1) + left;
int tem = nums[randomIndex];
nums[randomIndex] = nums[right];
nums[right] = tem;

AC代码:

class Solution {static Random random = new Random();public static int findKthLargest(int[] nums, int k) {return quickSortFindK(nums, 0, nums.length - 1, k);}public static int quickSortFindK(int[] nums, int left, int right, int k) {int randomIndex = random.nextInt(right - left + 1) + left;int tem = nums[randomIndex];nums[randomIndex] = nums[right];nums[right] = tem;int pivot = nums[left];int low = left;int high = right;while (low < high) {while (low < high && nums[high] <= pivot)high--;nums[low] = nums[high];while (low < high && nums[low] >= pivot)low++;nums[high] = nums[low];}nums[low] = pivot;if (low == k - 1) {return pivot;} else if (low > k - 1) {return quickSortFindK(nums, left, low - 1, k);} else {return quickSortFindK(nums, low + 1, right, k);}}
}

 时间上确实有了一些提升

解法二:堆排序。

建立小根堆,最后让小根堆里的元素个数保持在k个,那么此时栈顶的元素就是k个元素中最小的,即第k大的元素

可以通过优先级队列来模拟小根堆

AC代码

class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> queue = new PriorityQueue<>();for (int num : nums) {//已经有k个元素了,当前元素比堆顶元素还小,不可能是第k大的元素,跳过if (queue.size()==k&&queue.peek()>=num){continue;}queue.offer(num);}while (queue.size()>k){queue.poll();}return queue.peek();}
}

http://www.dinnco.com/news/77725.html

相关文章:

  • 网站建设总经理岗位职责seo实战密码第四版
  • 仿系统之家网站源码百度一下网页版浏览器
  • 住房与城乡建设部网站注册中心专业营销团队外包公司
  • 做微信公众号的网站吗灰色关键词排名代做
  • wordpress wp_nav_menu多级菜单上海关键词优化的技巧
  • 洛阳今日新闻头条宁波seo优化项目
  • 游戏开发软件手机版北京seo营销公司
  • 青岛做网站的公司排名网络营销是什么工作
  • 网站开发设计前景可以商用的电视app永久软件
  • 博物馆门户网站建设优势常州网站推广排名
  • 郑州网站建设代理商微信拓客的最新方法
  • 机场建设相关网站西安seo专员
  • 郑州做定制网站的公司哪家好互换链接的方法
  • 网站淘宝客怎么做的全国培训机构排名前十
  • 网站vip怎么做百度流量统计
  • 滨州网站建设制作aso优化哪家好
  • 德阳做网站百度指数查询官网大数据
  • 西安火车站网站建设怎么查百度竞价关键词价格
  • 怎么做扫码进入网站搜索引擎优化的方法和技巧
  • ps怎么做网站首页和超链接深圳全网推广服务
  • 无线设置网站小程序源码网
  • php做网站需要注意什么广州网络推广服务商
  • b2c商城解决方案长沙官网seo
  • 青岛有做网站的吗百度怎么搜索网址打开网页
  • 温州广告网页设计招聘网淘宝网店的seo主要是什么
  • 企业网站建设技术seo知识总结
  • 织梦模板大气网站建设类网站模板宁波seo高级方法
  • 广州手机网站开发报价广告推广精准引流
  • 广西网站建设公司招聘seo服务外包费用
  • 钉钉邮箱登录入口百度关键词优化大师