歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 百度面試題——需找下一個排列(Find next permuation, POJ 1883)

百度面試題——需找下一個排列(Find next permuation, POJ 1883)

日期:2017/2/28 15:30:47   编辑:Linux教程

面試中關於排列的題目還是蠻常見的,之前有個同學面百度,就遇到了一個排列題目,分享一下。

題目描述:
給你一個數組,如果是按照數字的大小排序,那麼請你輸出當前數組的下一個排列是什麼

例如, 下面的數據,就是按照排列序生成的四組數據。

3 1 2 4 5
3 1 2 5 4
3 1 4 2 5
3 1 4 5 2

雖然有個函數叫next_permutation, 不過做OJ還好,面試這個一定不行啦,所以還是自己分析一下。

分析:
我們用字典序的排列生成方法:


生成給定全排列的下一個排列

所謂一個的下一個就是這一個與

下一個之間沒有其他的。這就要求這一個與下一個有盡可能長的共同前綴,也即變化限制在盡可能短的後綴上。

算法分三個步驟:

一般而言,設P是[1,n]的一個全排列。

1. P=P1P2…Pn=P1P2…Pj-1PjPj+1…Pk-1PkPk+1…Pn

j=max{i|Pi<Pi+1},k=max{i|Pi>Pj}

2. 對換Pj,Pk,將Pj+1…Pk-1PjPk+1…Pn翻轉,

3. P’= P1P2…Pj-1PkPn…Pk+1PjPk-1…Pj+1即P的下一個。

代碼如下:

  1. Memory: 168K Time: 469MS
  2. Language: C++ Result: Accepted
  3. Source Code
  4. #include<stdio.h>
  5. #include <memory.h>
  6. void swap( int &a, int &b)
  7. {
  8. a = a ^ b;
  9. b = a ^ b;
  10. a = a ^ b;
  11. }
  12. bool GetNextPermutation(int a[], int size)
  13. {
  14. int m = size - 1;
  15. int i,j;
  16. while(m > 0 && a[m-1] > a[m]) // step 1
  17. {
  18. m--;
  19. }
  20. //in this case, the current permutation is the last
  21. if(m == 0) //
  22. {
  23. for( i = 0, j = size - 1; i < j; i++, j--)
  24. {
  25. swap(a[i], a[j]);
  26. }
  27. return false;
  28. }
  29. for( j = size - 1; j > m - 1; j--)//step 2
  30. {
  31. if(a[j] > a[m-1])
  32. {
  33. swap(a[j], a[m-1]);
  34. break;
  35. }
  36. }
  37. for( i = m, j = size - 1; i < j; i++, j--)//step 3
  38. {
  39. swap(a[j], a[i]);
  40. }
  41. return true;
  42. }
  43. void printArray(int a[], int size)
  44. {
  45. int i;
  46. for( i = 0; i < size; i++)
  47. {
  48. if( i == 0)
  49. {
  50. printf("%d", a[i]);
  51. }
  52. else
  53. {
  54. printf(" %d", a[i]);
  55. }
  56. }
  57. printf("\n");
  58. }
  59. int main()
  60. {
  61. int nSize;
  62. int a[1024];
  63. int ncase;
  64. scanf("%d", &ncase);
  65. int n,k;
  66. while(ncase--)
  67. {
  68. scanf("%d%d", &n, &k);
  69. for( int i = 0; i < n; i++)
  70. {
  71. scanf("%d", &a[i]);
  72. }
  73. while(k--)
  74. {
  75. GetNextPermutation(a, n);
  76. }
  77. printArray(a, n);
  78. }
  79. return 0;
  80. }
Copyright © Linux教程網 All Rights Reserved