给定数组 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;}
}

数组先小于等于再大于等于的调整相关推荐

  1. java8 从数组获取流_从数组到流再到Java 8

    java8 从数组获取流 不久前,我们将一些Eclipse插件项目升级到Java8.此后再也没有回头. 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容 ...

  2. 从数组到流再到Java 8

    不久前,我们将一些Eclipse插件项目升级到Java8.此后再也没有回头. 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容易和简洁. 我想到目前为止 ...

  3. 【数组】牛客网:调整数组顺序使奇数位于偶数前面(一)

    输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路: 新建一个数 ...

  4. 小于等于、 大于等于Mybatis 、oracle

    1.CDATA区:它的全称为character data,以"<![CDATA[ "开始,以" ]]>" 结束,在两者之间嵌入不想被解析程序解析的原 ...

  5. java数组去重_再谈JavaScript数组去重

    JavaScript的数组去重是一个老生常谈的话题了.随便搜一搜就能找到非常多不同版本的解法. 细想一下,这样一个看似简单的需求,如果要做到完备,涉及的知识和需要注意的地方着实不少. 定义重复(相等) ...

  6. Latex 小于等于,大于等于,不等于

    小于等于 \leq ≤\leq≤ 大于等于 \geq ≥\geq≥ 不等于 \neq ≠\neq​=

  7. 函数 —— memset() 将存放字符串的数组清空后再赋予该数组新的字符串

    void *memset(void *s, int ch, size_t n); 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返 ...

  8. C++二维数组名的再探索

    #include <iostream>int main() {int d2a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };//输出 0 ...

  9. 用键盘怎么直接打出小于等于和大于等于

    ≤:按住Alt,然后再按数字键盘41436 ≥:按住Alt,然后再按数字键盘41437

最新文章

  1. Eclipse+Maven+SpringMVC+Mybatis+MySql搭建总结
  2. OpenGL 具有深度恢复的SSAO
  3. JFreeChart(七)之气泡图表​​​​​​​
  4. high-speed A/D performance metrics and Amplifie...
  5. 前端在线学习网站W3School
  6. 六张图|教开发者该如何应对“中年危机”
  7. set是无序集合,放入set中的元素通过iterator输出时候是无序的
  8. python class def try_python 中exception,class学习
  9. redhat7图形界面网卡设置_Redhat Linux Interprise基本网络配置与调试
  10. js操作XML文件兼容IE与FireFox
  11. 零基础入行IT,怎么成为一名优秀的IT人才?
  12. 2021年中国巴豆酸市场趋势报告、技术动态创新及2027年市场预测
  13. 转一篇人生感悟,写的很好
  14. win7 32位系统搭建iphone开发环境
  15. 企业上线MES软件的费用真的很贵?
  16. nutch java_Nutch:用Java调用,而不是命令行?
  17. 地震引发的网络关系简化论
  18. 记一次win10升级win11的经历
  19. 项目管理的10大知识领域之范围管理
  20. 3月16日——3月20日课程表

热门文章

  1. 轴自定义图标_9种吸引人的图标样式,能给你的设计带来良好的用户体验
  2. 纯c语言贪吃蛇,纯C语言贪吃蛇 求助
  3. linux查看vnc服务关闭,linux配置vncserver服务
  4. Linux keepalived
  5. stm32关于.o的错误
  6. 解决nginx+php二级页面显示空白的问题
  7. C语言复习:指针知识
  8. 2.5-冗余VLAN
  9. Charles是Mac的Fiddler抓包工具
  10. 修改framework后重新刷入手机