首页 > 试题广场 >

数组的partition调整

[编程题]数组的partition调整
  • 热度指数:2072 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个有序数组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个整数为答案数组
示例1

输入

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
示例2

输入

5
2 3 4 4 5

输出

2 3 4 5 4

备注:

本题有special judge,对于右边的部分,你可以任意输出(在保证合法的前提下)
并不需要去纠结(n+1)/2,就算左边无重复元素的有序区域超过这个长度也无所谓。给定两个指针orderedBoundptr,一个指向左边无重复元素有序区域的最后一个元素,另一个指向下一个元素。ptr所指元素只要和orderedBound所指元素相等,为了去重就直接往右走;如果不相等,由于数组本来就是有序的,ptr一定是指到了大于orderedBound所指元素的最小元素,此时让它与有序区域的下一个元素交换,周而复始直到ptr遍历完数组。
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;
        }
    }
}

发表于 2021-12-08 17:34:50 回复(0)
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]+" ");
        }
	}
}


发表于 2019-10-24 20:23:19 回复(0)