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

有心学做网站导出 wordpress

有心学做网站,导出 wordpress,建设摩托车官网商城2015,国家企业信息网官网力扣75.颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sor…

力扣75.颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

 

class Solution { //时间复杂度为O(n)//其实,变量 zero 相当于我们在三路快速排序算法中的 lt;//变量 two 相当于我们在三路快速排序算法中的 gt。public void sortColors(int[] nums) {// nums[0...zero] == 0, nums[zero + 1, i] == 1, nums[two, n - 1] == 2// 定义三个指针:zero、i、two,分别表示0的最右边界、当前处理的元素、2的最左边界int zero = -1, i = 0, two = nums.length;while(i < two){// 当前处理元素的指针小于2的最左边界时,继续循环// 如果当前元素为0,将其与zero右边的元素交换,并将zero和i都向右移动一位if(nums[i] == 0){zero++;swap(nums,zero,i);i++;}// 如果当前元素为2,将其与two左边的元素交换,并将two向左移动一位else if (nums[i] == 2){ // 注意此时不需要i右移,因为交换后的元素还需要继续判断two --;swap(nums, i, two);}else{ //如果当前元素是1,不需要操作,直接继续向右遍历i ++;}}}// 交换数组中指定位置的两个元素private void swap(int[] nums, int i, int j){int t = nums[i];nums[i]= nums[j];nums[j] = t;}
}


我们首先来封装一个 selectK 的方法。封装好了这个方法以后,这三个问题都可
以快速求解。
我们的 selectK 的接口是这样的:
// 在 arr[l...r] 的范围里求解整个数组的第 k 小元素并返回
// k 是索引,即从 0 开始计算
int selectK(int[] arr, int l, int r, int k, Random rnd)
因为我们的 partition 过程需要随机选取标定点,所以我们还需要传一个 Random(快排的优化)
类的对象 rnd。
定义好函数签名以后,下面我们来书写相应的逻辑。
首先,selectK 的过程,我们就是要执行一遍 partition。在这里,我使用双路快速
排序的 partition。
注意,因为在这个问题中,我们肯定我们处理的数据类型是 int,所以,在代码
中,我不再使用泛型:

private int partition(int[] arr, int l, int r, Random rnd){// 生成 [l, r] 之间的随机索引int p = l + rnd.nextInt(r - l + 1);swap(arr, l, p);// arr[l+1...i-1] <= v; arr[j+1...r] >= vint i = l + 1, j = r;while(true){while(i <= j && arr[i] < arr[l])i ++;while(j >= i && arr[j] > arr[l])j --;if(i >= j) break;swap(arr, i, j);i ++;j --;
}swap(arr, l, j);return j;
}
private void swap(int[] arr, int i, int j){int t = arr[i];arr[i] = arr[j];arr[j] = t;
}

有了 partition,我们的 selectK 的主题逻辑非常简单。

首先,进行 partition,假设结果是 p。我们只需要将 k 和 p 做比较。

  • 如果 k == p,直接返回 arr[p] 即可;
  • 如果 k < p,在 arr[l, p - 1] 的范围继续找,即调用 selectK(arr, l, p - 1, k, rnd);
  • 如果 k > p,在 arr[p + 1, r] 的范围继续找,即调用 selectK(arr, p + 1, r, k, rnd);

就有了下面的代码:

private int selectK(int[] arr, int l, int r, int k, Random rnd){
int p = partition(arr, l, r, rnd);
if(k == p) return arr[p];
if(k < p) return selectK(arr, l, p - 1, k, rnd);return selectK(arr, p + 1, r, k, rnd);
}

这样,我们就完成了 select K 的过程。是不是非常简单!

下面,我们用我们写的 select K,先来解决 Leetcode 上第 215 号问题:

这个问题是求第 k 大元素,但是我们的 selectK 求得是第 k 小元素。怎么办?
非常简单,我们只需要在调用 select K 之前,将求第 k 大元素的这个 k,转换成
对应求的是第几小元素对应的索引就好了。
按照题目描述,如果 k 是 1,对应就是要找最大元素,那么相应的我们的
select K 的索引,就是 nums.length - 1。(如果10个数,K=1,第一个最大的数,就是SelectK索引为9的那个的元素)
如果 k 是 nums.length,其实就是求最小元素,那么相应的我们的 selectK 的
索引,就是 0。  (如果10个数,第10个最大的数,就是SelectK索引为0的那个的元素,最小值)
他们之间的转换关系是 nums.length - k。

力扣215.数组中的第K个最大元素 

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

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

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

import java.util.Random; //导入Random包
class Solution {public int findKthLargest(int[] nums, int k) {//只有两行,其他的内容全部复用我们上面实现的 selectK,是不是很酷?//我们的SelectK是第K最小元素,所以这里findKthLargest传入下标要处理一下//转换关系是 nums.length - kRandom rnd = new Random();return selectK(nums, 0, nums.length - 1, nums.length - k, rnd);}//有了 partition,我们的 selectK 的主题逻辑非常简单。private int selectK(int[] arr, int l, int r, int k, Random rnd){//首先,进行 partition,假设返回值结果是 p。我们只需要将 k 和 p 做比较。int p = partition(arr, l, r, rnd); //如果 k == p,直接返回 arr[p] 即可;if(k == p) return arr[p]; //如果 k < p,在 arr[l, p - 1] 的范围继续找,即调用 selectK(arr, l, p - 1, k, rnd);if(k < p) return selectK(arr, l, p - 1, k, rnd); //如果 k > p,在 arr[p + 1, r] 的范围继续找,即调用 selectK(arr, p + 1, r, k, rnd);return selectK(arr, p + 1, r, k, rnd);
}private int partition(int[] arr, int l, int r, Random rnd){// 生成 [l, r] 之间的随机索引int p = l + rnd.nextInt(r - l + 1);swap(arr, l, p);// arr[l+1...i-1] <= v; arr[j+1...r] >= vint i = l + 1, j = r;while(true){while(i <= j && arr[i] < arr[l])i ++;while(j >= i && arr[j] > arr[l])j --;if(i >= j) break;swap(arr, i, j);i ++;j --;}swap(arr, l, j);return j;}//数组指定索引,两数交换private void swap(int[] arr, int i, int j){int t = arr[i];arr[i] = arr[j];arr[j] = t;}
}

http://www.laogonggong.com/news/98887.html

相关文章:

  • 门户网站建设招标公告WORDPRESS 土木坛子
  • 医疗网站建设哪个好用肇庆seo排名外包
  • 如何把做的网站与域名连接不上网站建设期任务及总结
  • 如何做双语网站免费网站程序下载
  • 做网站设计制作的网站建设公司成就
  • copyright技术支持 东莞网站建设关于给予网站建设的请求
  • 甘肃省集约化网站建设备案网站负责人必须为法人吗
  • 太原建站的模板企业策划书3000字
  • 建站平台 在线提交表格功能wordpress邮箱发送信息错误
  • 中国十大网站建设企业如何说服企业做网站
  • 惠州 家具 网站上线做网站要什么软件
  • 外贸网站友情链接惠州网站推广
  • 四会建设局网站企业网站建设的步骤过程
  • 凡科网做的网站怎么样wordpress 开发网站
  • 潍坊哪个网站公司做优化好wordpress 游戏网站
  • 成都企业网站建设模板自做网站域名重定向
  • 给公司做网站 图片倾权学院加强网站建设
  • 有哪个网站可以学做吃的注册资本1000万的公司需要多少钱
  • 如何推广企业官方网站内容软件工程师是什么专业
  • 佛山网站建设运营电子商务网站建设成果ppy
  • 外国做足球数据网站做海报的网站推荐
  • 济南新网站优化没有备案的网站怎么访问
  • wordpress模板制作视频教程网站关键词google优化怎么做
  • 深圳发型网站建设哪些公司的网站做的很好
  • 饮水机企业网站模板深圳十大电商巨头
  • 爱站网长尾挖掘工具做外汇需要关注哪几个网站
  • 松江公司做网站长期网站外包
  • 如何运营一个网站自己编程做网站
  • 新手做网站怎么上传系统南宁百度关键词推广
  • 长沙网站优化推广抚州的电子商务网站建设公司