有趣的排序

题目
度度熊有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序?

输入描述:首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)
输出描述:输出一个整数表示最少的操作次数。

输入:
4
19 7 8 25
输出:
2

思路1
1)用一个辅助数组B,将原数组A中元素从小到大排序。
2)从数组B第一个元素开始,查找A中不需要移动的元素。假设A为[3,5,4,2,3,7],则B为[2,3,3,4,5,7],则原数组A除2,3(第二个3)不需要移动外,其余元素都需要移动,操作次数=数组大小-不需要移动的元素个数(即4=6-2)

代码1

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] array = new int[n];
        int[] array1 = new int[n];
        while(scan.hasNext()){
            for(int i=0;i<n;i++){
                array[i] = scan.nextInt();
                array1[i] = array[i]; 
            }
            Arrays.sort(array1);
            int count = 0;
            int index = 0;
            for(int i=0;i<n;i++){
                if(array1[index] == array[i]){
                    count++;
                    index++;
                }
            }
            System.out.println(n-count);
        }
        scan.close();
    }
}

思路2
1)运用map,将元数组存入map中,map的key存储array[i],value存储i。
2)将数组array从小到大排序,排序后,array[i]<=array[i+1]。
3)若map.get(array[i])>map.get(array[i+1]),则表示在待排序数组中,array[i+1]在array[i]的前面,必须将arr[i+1]移动到最后的位置,更新map中array[i+1]对应的value值。

代码2

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] array = new int[n];
        while(scan.hasNext()){
            for(int i=0;i<n;i++){
                array[i] = scan.nextInt();
            }
            Map<Integer,Integer> map = new HashMap<Integer, Integer>();
            for(int i=0;i<n;i++){
                map.put(array[i], i);  //map的key存储array[i],value存储i;
            }
            Arrays.sort(array);
            int count = 0;
            int index = n;
            for(int i=0;i<n-1;i++){
                // array已经排序,故array[i]<=array[i+1],
                // 若map.get(array[i])>map.get(array[i+1]),
                //则表示在待排序数组中,array[i+1]在array[i]的前面
                if(map.get(array[i])>map.get(array[i+1])){   
                    count ++;
                    map.put(array[i+1], map.size()+index);
                    index++;
                }
            }
            System.out.println(count);
            
        }
        scan.close();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,787评论 0 33
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,410评论 0 1
  • 匆匆忙忙一刻初见 恍恍惚惚木石前缘 痴痴傻傻十分挂念 轻轻缓缓两手相牵 冷冷暖暖刹那缠绵 真真假假一相情愿 忧忧戚...
    鄂仁阅读 260评论 0 0
  • 喜欢一个人很长很长时间是什么感觉既想做他心头的朱砂痣也想做他床前的明月光 喜欢一个人很长时间是一种怎样的体验? 多...
    Galen佳阅读 302评论 0 1