笔试面试算法经典--数组partition调整使数组的左部分单调有序
来源:互联网 发布:java写入txt文件 编辑:程序博客网 时间:2024/06/01 22:57
【题目】
给定一个有序数组arr,调整使得数组的左部分无重复元素且有序,右边部分不要求。如数组arr[]={1,2,2,2,3,3,4,5,6,9,9} ;调整过后可以为:[1, 2, 3, 4, 5, 6, 9, 2, 3, 2, 9] 。
思路:使用标记 u 其中arr[0…u] 表示已经处理过的没有重复元素且有序的区间,从arr[u+1…i-1]表示有重复元素的部分。则算法主要分为下面两部分。
1. 比较 arr[i] 与 arr[u] 是否相同如果不同,则将 arr[i] 的值赋给arr[u+1],u++;
2. i++遍历数组。
例如的数组:arr[]={ 1, 2, 2, 2, 3, 3, 4, 5} 的处理过程。
下图中:绿色–没有重复且有序部分 黄色–指针遍历到的位置 棕色–重复区域
⑤重复操作直到遍历到数组的最后一个元素。
1.刚开始是u=0指向1, i=1指向2, 因为arr[u]!=arr[i], 此时,arr[u+1]=arr[i],i++,u=1,i=2,
2.此时i=2指向2,u=1指向2,arr[u]=arr[i]所以不处理,只进行 i++。
3.循环上面操作直至数组遍历完成。
import java.util.Arrays;public class NORepeatInLeft { public static void main(String[] args) { int arr[]={1,2,2,2,3,3,4,5,6,9,9}; norepeat(arr); System.out.println(Arrays.toString(arr)); } public static void norepeat(int arr[]) { if(arr==null||arr.length==0) return; int u=0; //u刚开始时赋值0,i赋值1。 for(int i=1;i<arr.length;i++) { if(arr[i]!=arr[u]) { swap(arr,i,u+1); u++; //如果arr[i]!=arr[u]交换他们的值,然后u++, } } } //交换两个值的函数 public static void swap(int arr[],int i,int j) { int temp; temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; }}
0 0
- 笔试面试算法经典--数组partition调整使数组的左部分单调有序
- 笔试面试算法经典-找到数组中出现次数大于N/k的数(Java)
- 笔试面试算法经典-打印n个数组中最大的topk
- 笔试面试算法经典--连续子数组的最大乘积及连续子数组的最大和(Java)
- 笔试面试算法经典-未排序正整数数组中累加和为给定值的子数组
- 笔试面试算法经典--二叉搜索树转有序的双向链表(Java)
- 笔试题:有序数组的合并
- 笔试题,在部分有序的数组中寻找给定值
- 面试or笔试4——合并两个有序数组为一个有序数组
- 面试:数组:合并有序数组
- 笔试面试之有序数组中查找和为定值的两个数
- 笔试面试算法经典--打印数组中相加和为给定值的二元组及三元组(Java)
- 笔试面试中关于数组的常见算法
- 程序员笔试面试算法题系列--数组
- 左神面试算法整理---单调栈
- 循环有序数组算法
- 算法---左旋转数组
- 经典算法题:2个有序数组求合并后的中位数
- 【OpenGL】OpenGL系列——07帧缓存操作
- 学习Javascript闭包(Closure)
- Flink实现WordCount
- 归并排序
- 多线程基础部分小结
- 笔试面试算法经典--数组partition调整使数组的左部分单调有序
- 使用java理解程序逻辑第十一章
- UVA11582 Colossal Fibonacci
- Android异步----重新认识Android(6)
- 【OpenGL】OpenGL系列——08绘制曲面与查询函数
- git制作和提交patch
- 地图开发——腾讯地图混淆::app:shrinkReleaseMultiDexComponents
- as构建结构
- Linux一些点