阿里云开发者社区在线编程86.完美排列
微wx笑
2020-07-14【算法】
326
6
0关键字:
阿里云 开发者社区 在线编程 完美排列
完美排列概述:完美排列的定义为一个长度为n的数组,n个元素各不相同且每个元素均在[1,n]的范围内。现在给你长度为n的数组,你每次可以进行如下操作:任选数组中的一个元素,将其加一
目录
完美排列
概述:
完美排列的定义为一个长度为n的数组,n个元素各不相同且每个元素均在[1,n]的范围内。
现在给你长度为n的数组,你每次可以进行如下操作:任选数组中的一个元素,将其加一或者减一,问最少需要多少次操作才能够使得该数组为一个完美排列。
输入一个整数n,表示数组的长度(1 <= n <= 10^4);
再输入含有n个数的数组,第i个数表示数组中的第i个元素为ai(1 <= ai <= 10^5)。
输出一个整数表示将该数组变成一个完美排列的最少操作次数。
示例1
1 2 3 4 5 | 输入: 2 [3,0] 输出: 2 |
注意
3->2
0->1
总共需要操作两次
示例2
1 2 3 4 5 | 输入: 81 [34,80,53,52,51,65,77,15,28,100,87,65,66,66,49,92,31,8,10,24,84,47,91,63,75,76,76,99,70,99,85,56,28,17,30,64,79,16,54,28,70,26,87,21,31,13,1,11,43,98,98,28,33,23,100,56,36,34,81,36,45,63,71,72,81,53,78,13,63,94,23,67,32,20,18,80,6,18,87,2,91] 输出: 816 |
什么是完美排列?
完美排列的定义为一个长度为n的数组,n个元素各不相同且每个元素均在[1,n]的范围内。
我的理解就是给你3个数,完美排列的结果就是[1,2,3]或者[3,2.1]。
正确解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | package solution86; import java.io.BufferedReader; import java.io.IOException; import java.util.Arrays; import com.weixiao.roundtable.frame.IOHelper; public class Solution { public static int solution( int n, int [] a) { int count = 0 ; Arrays.sort(a); //先对数组进行排序,得到升序的数组,例如[1,2,3,4,5] //处理第一个元素 if (a[ 0 ] != 1 ){ count = a[ 0 ] - 1 ; a[ 0 ] = 1 ; } for ( int i= 0 ;i<a.length- 1 ;i++){ int d = a[i+ 1 ] - a[i]; if (d > 1 ){ //比如:a[i+1] =5,a[i] = 3,中间差一个4 a[i+ 1 ] -= d - 1 ; count += d - 1 ; } else if (d < 1 ){ a[i+ 1 ] += Math.abs(d)+ 1 ; count += Math.abs(d)+ 1 ; } } return count; } public static void main(String[] args) { // TODO Auto-generated method stub int [] a = new int []{ 34 , 80 , 53 , 52 , 51 , 65 , 77 , 15 , 28 , 100 , 87 , 65 , 66 , 66 , 49 , 92 , 31 , 8 , 10 , 24 , 84 , 47 , 91 , 63 , 75 , 76 , 76 , 99 , 70 , 99 , 85 , 56 , 28 , 17 , 30 , 64 , 79 , 16 , 54 , 28 , 70 , 26 , 87 , 21 , 31 , 13 , 1 , 11 , 43 , 98 , 98 , 28 , 33 , 23 , 100 , 56 , 36 , 34 , 81 , 36 , 45 , 63 , 71 , 72 , 81 , 53 , 78 , 13 , 63 , 94 , 23 , 67 , 32 , 20 , 18 , 80 , 6 , 18 , 87 , 2 , 91 }; int count = 0 ; count = solution( 81 , a); System.out.println( "count===" + count); //有时候数组太大,所以只能放到文件中 BufferedReader br = IOHelper.getBufferedReader( "D:/Workspaces_aliyun/test.txt" ); String str = "" ; try { str = br.readLine(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } String[] sa = str.split( "," ); if (sa.length > 0 ){ a = new int [sa.length]; for ( int i= 0 ;i<sa.length; i++){ a[i] = Integer.valueOf(sa[i]); } } count = solution( 14846 , a); System.out.println( "count===" + count); } } |
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/algorithm/2020-07-14/507.html