算法总结之 数组的partition调整

给定一个有序数组arr, 调整arr使得这个数组的左半部分没有重复元素且升序,而且不用保证右边是否有序

分区就ok了 u区是 无重复且升序的  u是这个区域的最后位置,初始u=0

i做从左到右的遍历,在arr[u+1....i]上是不保证没有重复元素且升序的区 i是这个区域的最后位置

i向右移动     因为数组整体有序,如果arr[i] !=arr[u] 说明当前arr[i]应该加入到 u区域里  则交换之!  如果arr[i]==arr[u] 说明当前数arr[i]的值之前已经加入到u区域里

上代码:

package TT;

public class Test81 {

    public void leftUnique(int[] arr){

        if(arr==null || arr.length<2){
             return;
        }
        int u = 0;
        int i =1;
        while(i != arr.length){
            if(arr[i++]!=arr[u]){
                swap(arr, ++u, i-1);
            }
        }

    }

}
时间: 2024-11-03 05:42:16

算法总结之 数组的partition调整的相关文章

[算法]数组的partition调整

题目一: 给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复部分且升序,而不用保证右部分是否有序. 例如:arr=[1,2,2,2,3,3,4,5,6,6,7,7,8,8,9,9],调整之后arr=[1,2,3,4,5,6,7,8,9-]. 要求: 时间复杂度O(N),额外空间复杂度O(1) 程序: public static void leftUnique(int[] arr) { if (arr == null || arr.length < 2) { return; } in

8.23 数组的partition调整

[题目]: 给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复元素且升序,而不用保证右部分是否有序 例如: arr=[1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],调整之后arr=[1, 2, 3, 4, 5, 6, 7, 8, 9, ...] [补充题目]: 给定一个数组arr,其中只可能含有0.1.2三个值,请实现arr的排序 另一种问法为:有一个数组,其中只有红球.篮球和黄球,请实现红球全放在数组的左边,篮球放在中间,黄球放在

[程序员代码面试指南]数组和矩阵-数组的partition调整

题目 补充问题:数组只含0,1,2,对数组排序,要求时间复杂度O(n),额外空间复杂度O(1) 题解 维护三个变量,l,idx,r.左区间[0,l],中间区间[l+1,idx],右区间[idx+1,r]. 初始化l=-1,r=len,idx=0.idx用来遍历数组. 当arr[idx]=1,idx++; 当arr[idx]=0,swap(arr[l+1,idx]),i++,idx++ 当arr[idx]=2,swap(arr[idx,r-1]),r--,idx++ 当idx=r说明中区间和右区间

字符串匹配KMP算法中Next[]数组和Nextval[]数组求法

数据结构课本上给了这么一段算法求nextval9[]数组 1 int get_nextval(SString T,int &nextval[ ]) 2 { 3 //求模式串T的next函数修正值并存入数组nextval. 4 i=1; nextval[1]=0; j=0; 5 while(i<T[0] 6 { 7 if(j==0||T[i]==T[j]) 8 { 9 ++i; 10 ++j; 11 if (T[i]!=T[j]) 12 nextval[i]=j; 13 else 14 nex

KMP算法的next[]数组通俗解释

我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容. 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大.

KMP算法-之next数组-详解

我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性,如果有对称属性,那么就需要向前查找是否有可以再次匹配的内容. 在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大.

[算法]找出数组当中的中枢元素

给定一个整型数组,找出pivot,使得对于任意i < pivot,a[i] <=a[pivot],对于i > pivot,a[i]>=a[pivot],只能用一个额外的数组,和少量空间. 思路 1.使用一个数组t记录,t[i]记录的是a[0]~a[i]的最大值 int *t = new int[n]; for(int i = 0, max = ~0; i < n; ++i){ if(a[i] > max){ max = a[i]; } t[i] = max; } 2.从

(算法)求数组中出现频率最高的数

不准备实现算法先,根据21题和前辈的经验,这道题的真正考核点不在于解决这个问题,而在于拿到这个问题以后题的问题. 正常的一个做法,一次扫描然后用HASHMAP进行一个统计,然后再扫描一次HASHMAP获得频率最高的数.时间是O(N)空间也是O(N). 还有一种是做排序,然后扫描一次根据下标计算可以得到频率最高的数(可以避免空间消耗?). (不知道是否还有别的做法?) 据说我们应该先问这个数组是否已经排序?(想得美) 然后是否已经知道这个数的大概出现频率(比如说超过一半) 是否可以用额外空间?是否

hdu3336解读KMP算法的next数组

查看原题 题意大致是:给你一个字符串算这里面所有前缀出现的次数和.比如字符串abab,a出现2次,ab出现2次,aba出现1次,abab出现1次.总计6次. 并且结果太大,要求对1007进行模运算. AC代码 #include <iostream> using namespace std; #include <string> string s; int n,Next[200005]; void getNext() { int len = n; Next[0]=-1; int i=0