日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组先小于等于再大于等于的调整

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组先小于等于再大于等于的调整 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定數組 arr,請將數組調整成 a <= b >= c <= d >= e <= f...的樣子

例如,arr = {3,1,2}
調整之后,arr 可以是{1,3,2}. 1 <= 3 >=2
調整之后,arr 也可以是{2,3,1}. 2 <= 3 >=1
arr = {3,1,2,6}
調整之后,arr 可以是{1,6,2,3}. 1 <= 6 >= 2 <= 3
調整之后,arr 也可以是{3,6,1,2}. 3 <= 6 >= 1 <= 2

1,如果 arr 長度為 N,要求時間復雜度為 O(N),額外空間復雜度為 O(1)。
2,arr 可能會不止一種調整方案,但只要滿足要求即可。


算法原形:完美洗牌算法


public static void shuffle(int[] arr, int l, int r){while(r - l + 1 > 0){int lenAndOne = r - l + 2;int bloom = 3;int k = 1;while(bloom <= lenAndOne / 3){bloom += 3;k++;}int m = (bloom - 1) / 2;int mid = (l + r) / 2;rotate(arr, l + m, mid, mid+m);cycles(arr, l - 1, bloom, k);l = l + bloom - 1;} }public static void cycles(int[] arr, int base, int bloom, int k){for(int i = 0, trigger = 1; i < k; i++, trigger += 3){int next = (2*trigger) % bloom;int cur = next;int record = arr[next + base];int tmp = 0;arr[next + base] = arr[trigger + base];while(cur != trigger){next = (2 * cur) %bloom;tmp = arr[next + base];arr[next + base] = record;cur = next;record = tmp;}} }public static void rotate(int[] arr, int l, int m, int r){reverse(arr, l, m);reverse(arr, m + 1, r);reverse(arr, l ,r); }public static void reverse(int[] arr, int l, int r){while(l < r){int tmp = arr[l];arr[l++] = arr[r];arr[r--] = tmp;} }

總結

以上是生活随笔為你收集整理的数组先小于等于再大于等于的调整的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。