2组:

[抄题]:

给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:

  • 所有小于k的元素移到左边
  • 所有大于等于k的元素移到右边

返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k

[思维问题]:

想不到两个小人的partition

[一句话思路]:

两个小人的partition,不用排序

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 直接调换就行了,不用写swap函数
  2. 要判断left < right,防止left加过头了
  3. corner case别忘了

[总结]:

  1. 一直到left = right时都要一直处理,所以判断条件是left <= right。

[复杂度]:

Time complexity: 平均情况下,O(nlgn)每个数都放在一半中, Space complexity: O(lgn)放在一半中

[英文数据结构,为什么不用别的数据结构]:

降低复杂度

[其他解法]:

排序

[Follow Up]:

[题目变变变]:

/**
* 本参考程序来自九章算法,由 @九章算法 提供。版权所有,转发请注明出处。
* - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
* - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,
* - Big Data 项目实战班,算法面试高频题班, 动态规划专题班
* - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
*/ public class Solution {
/**
*@param nums: The integer array you should partition
*@param k: As description
*return: The index after partition
*/
public int partitionArray(int[] nums, int k) {
if(nums == null || nums.length == 0){
return 0;
} int left = 0, right = nums.length - 1;
while (left <= right) { while (left <= right && nums[left] < k) {
left++;
} System.out.println("left++之后 = " + left); while (left <= right && nums[right] >= k) {
right--;
}
System.out.println("right--之后 = " + right); //左边的数字太大,右边的数字太小的时候就换一下
if (left <= right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp; // left++;
// right--;
System.out.println("left又变了 = " + left);
System.out.println("right又变了 = " + right);
}
}
return left;
}
}

3组:

[抄题]:

Given an array with n objects colored red, white, or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.You are not suppose to use the library's sort function for this problem.

[思维问题]:

[一句话思路]:

用partition,指定k,不用返回。结果就是小于k的数在左边,大于等于的在右边。

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. nums[left] < k 时自加,因为前面有元素。会导致后面直接越出边界条件

[二刷]:

  1. while移动的时候也要在if里保证没有超出边界
  2. 比较是分为两边,左右都是和边界比较

[总结]:

不是左小右大就要交换。

交换后的加减只是促进往前走罢了,防止TLE。

第一次交换之后要reset右边界。

一些个等号实在是太恶心了,就算了吧

[复杂度]:

Time complexity: 平均情况下,O(nlgn)每个数都放在一半中, Space complexity: O(lgn)放在一半中

[英文数据结构,为什么不用别的数据结构]:

[其他解法]:

遍历+交换

[Follow Up]:

[题目变变变]:

class Solution {
public void sortColors(int[] nums) { int left = 0;
int right = nums.length - 1;
while(left <= right) {
//符合条件的
while(left < right && nums[left] < 1) {
left++;
}
while(left <= right && nums[right] >= 1) {
right--;
}
System.out.println("left = " + left);
System.out.println("right = " + right); //还是左边比右边小,说明符合条件的卡住了,没有完全进行。此时就需要交换
if (left <= right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp; left++;
right--;
}
} right = nums.length - 1;
while(left <= right) {
while(left <= right && nums[left] < 2) {
left++;
}
while(left <= right && nums[right] >= 2) {
right--;
}
if (left <= right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp; left++;
right--;
}
}
}
}
k组

[抄题]:

[思维问题]:

  1. 还是要用指针l,r ,指向开头和结尾
  2. k不知道取什么,就取中间的colormid
  3. 边界条件返回;

[一句话思路]:

把index和color分开排序,看作是最高版本

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. rainbowSort自定义函数中也有特殊情况:左指针比较小,左边颜色数量和右边一样
  2. colors[l] <= colorMid时要自己增加,因为有数值colorMid
  3. 第二次调用的颜色开头是mid + 1
  4. colors_mid是1-k之间的数值啊拜托

[总结]:

[复杂度]:Time complexity: O() Space complexity: O()

[英文数据结构,为什么不用别的数据结构]:

就用array,可以partition

[其他解法]:

双指针 nk

[Follow Up]:

[题目变变变]:

public class Solution {
/*
* @param colors: A list of integer
* @param k: An integer
* @return: nothing
*/
public void sortColors2(int[] colors, int k) {
// write your code here
if (colors == null || colors.length == 0) {
return;
} rainbowSort(colors, 0, colors.length - 1, 1, k);
} private void rainbowSort(int[] colors, int left, int right, int colors_left, int colors_right) {
int l = left;
int r = right;
int colors_mid = (colors_left + colors_right) / 2; if (left >= right) {
return ;
}
if (colors_left == colors_right) {
return ;
} while(l <= r) {
while(l <= r && colors[l] <= colors_mid) {
l++;
}
while(l <= r && colors[r] > colors_mid) {
r--;
}
if (l <= r) {
int temp = colors[r];
colors[r] = colors[l];
colors[l] = temp; l++;
r--;
}
rainbowSort(colors,left,r,colors_left,colors_mid);
rainbowSort(colors,l,right,colors_mid + 1,colors_right);
}
}
}
大小写排序:
用Character.isLowerCase 

基于快速排序的数组划分:2组 3组 K组(sort color)大小写排序 · Partition Array的更多相关文章

  1. lintcode 中等题:partition array 数组划分

    题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...

  2. 基于快速排序思想partition查找第K大的数或者第K小的数。

    快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a, ...

  3. (转)基于快速排序的TOPK算法

    基于快速排序的TOPK算法 转自:http://blog.csdn.net/fanzitao/article/details/7617223 思想: 类似于快速排序,首先选择一个划分元,如果这个划分元 ...

  4. "《算法导论》之‘线性表’":基于动态分配的数组的顺序表

    我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分 ...

  5. 将数组划分成连续子序列 Split Array into Consecutive Subsequences

    2018-08-04 20:47:43 问题描述: 问题描述: 本题需要的是将一个数组划分成子序列,保证每个子序列是连续的,并且长度要大于等于3. 解题思路是使用贪心算法,首先对数组中的数字进行计数, ...

  6. 【算法30】从数组中选择k组长度为m的子数组,要求其和最小

    原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...

  7. CodeForces - 1175D Array Splitting(数组划分+后缀和+贪心)

    You are given an array a1,a2,…,ana1,a2,…,an and an integer kk. You are asked to divide this array in ...

  8. 坐标轴刻度取值算法-基于魔数数组-源于echarts的y轴刻度计算需求

    本文链接:https://blog.csdn.net/qq_26909801/article/details/96966372数值型坐标轴刻度计算算法前言算法描述上代码代码运行效果结语前言因实习的公司 ...

  9. 三 基于Java动态数组手写队列

    手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...

随机推荐

  1. TOM带你玩充电 篇三:15款5号电池横评及选购建议——南孚金霸王小米宜家耐时品胜一个都逃不了

    双鹿电池的几个版本 理论上来说性价比:绿骑士>金骑士>黑骑士>蓝骑士 绿骑士和金骑士都很不错.哪个便宜买哪个. 小米性价比虽然最高,但是超市买不到. 蓝骑士是普通碳性电池,黑骑士是高 ...

  2. 使用HTML5里页面可见性接口判断用户是否正在观看你的页面

    转自:http://www.webhek.com/page-visibility 长期以来我们一直缺少一个判断用户是否正在浏览某个指定标签页的方法.用户是否去看别的网站了?他们切换回来了么?现在,HT ...

  3. javascript创建对象之动态原型模式(五)

    function Human(name, sex) { this.name = name; this.sex = sex; if (typeof this.say != "function& ...

  4. 关于javascript的cookie的封装

    /******************cookie*********************/ /* cookie的组成部分: 名称:唯一值,不区分大小写,必须经过URL编码 值:必须经过URL编码 ...

  5. JVM内部细节之三:字符串及字符串常量池

    本人最近正在面试,然后注意到总是有公司喜欢考String的问题,如字符串连接有几种方式,它们之间有什么不同等问题:要不就是给一段代码问创建了几个对象.那么该不该问呢?我认为当面试有一定工作经验的求职者 ...

  6. Keras实现简单BP神经网络

    BP 神经网络的简单实现 from keras.models import Sequential #导入模型 from keras.layers.core import Dense #导入常用层 tr ...

  7. 长沙雅礼中学集训-------------------day2

    怎么说呢,今天的题特别的神奇,因为emmmmmm,T1看不懂(一直到现在还没有理解明白期望概率什么的),T2题面看不懂+扩展欧几里得求逆元怎么求我忘了,T3哇,终于看懂一题了,然而写了个50分的程序但 ...

  8. json 拖拽

    1.梳理知识点 1.事件对象   e || event  2.事件对象的属性      鼠标事件对象 : 坐标属性 :  clientX  clientY  pageX  pageY   offset ...

  9. mysql 分片

    MySQL Fabric(分片)  是一个用于管理 MySQL 服务器群的可扩展框架.该框架实现了两个特性 — 高可用性 (HA ) 以及使用数据分片的横向扩展.这两个特性既可以单独使用,也可以结合使 ...

  10. windows2012任务计划不执行

    1.Windows Server 2008 计划任务在哪里配置? 2.Windows Server 2008 可以配置每分钟或是每小时执行我的任务吗? 答案是:可以! 首先Windows Server ...