给定一个有序数组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, .....]。
[要求]
时间复杂度为
,空间复杂度为
第一行一个整数N。表示数组长度。
接下来一行N个整数,表示数组内元素
输出N个整数为答案数组
16 1 2 2 2 3 3 4 5 6 6 7 7 8 8 8 9
1 2 3 4 5 6 7 8 9 6 2 7 2 8 8 3
5 2 3 4 4 5
2 3 4 5 4
本题有special judge,对于右边的部分,你可以任意输出(在保证合法的前提下)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] strArr = br.readLine().split(" ");
int[] arr = new int[n];
for(int i = 0; i < n; i++) arr[i] = Integer.parseInt(strArr[i]);
partition(arr);
for(int i = 0; i < n; i++) System.out.print(arr[i] + " ");
}
private static void partition(int[] arr) {
int orderedBound = 0, ptr = 1;
while(ptr < arr.length){
// 指针所指的元素跟有序区最后一个元素相等就直接走,不相等就跟有序区的下一个位置交换
if(arr[orderedBound] != arr[ptr])
swap(arr, ++orderedBound, ptr);
ptr++;
}
}
private static void swap(int[] arr, int i, int j) {
if(i != j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i=0;i<n;i++){
arr[i] = scanner.nextInt();
}
int p = 0;
for(int i=1;i<n;i++){
if(arr[i] != arr[p]){
p++;
int temp = arr[i];
arr[i] = arr[p];
arr[p] = temp;
}
}
for(int i=0;i<n;i++){
System.out.print(arr[i]+" ");
}
}
}