百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序
一、题目理解
题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'<'运算符的。
数据结构第一章就讲了有序表合并,不过那时候是合并到新表,判断条件是while(i<len1||j<len2),然后把a1或者a2数组(只有一个,因为另一个必定已经完全插入进了c数组,这也是为什么while条件是“或”)后面的元素;如果数据结构老师足够负责的话就应该提到这种情况,或者讲讲;不过由此来看,BAT的面试题很多还是来自课本的。
二、算法实现
设定两个指针left和right,初始状态下分别指向两个排序数组的首元素,然后比较a[left]和a[right]大小,如果a[left]<=a[right],那么数组中元素位置不发生改变,然后left往前进一步。如果a[left]>a[right],则表明前半段元素中存在大于后半段的元素,那么我们将后半段这个小的元素移到前半段来。但是在移动之前,我们得为这个元素空留出地方。这就有了元素移动的操作。比如{1,3,5,7,2,4,6,8,10}这样子序列,我们发现后半段的2小于前半段的3,那么我们将2放入临时变量temp中,然后将{3,5,7}往后移动一个位置,然后将空出来的位置放入temp的值。这里总体的循环是while(left<right&&right<len)。
做这个题,我首先确实想到了插入排序,不过结合ACM,我想到插入排序需要移动元素,这样时间复杂度可能比较高,不能AC(ACM对我的影响太大了),我立马排除了这种想法,哎,只需要考虑空间复杂度的。
package a;
public class Test1 {
static int[] a = {1,3,5,7,9,0,2,4,6,8};
public static void main(String[] args) {
// TODO Auto-generated method stub
solve(a,4,9);
for(int i:a) {
System.out.print(i+" ");
}
System.out.println();
}
private static void solve(int[] a, int mid, int num) {
// TODO Auto-generated method stub
int i=0;
int j=mid+1;
/*
* 原来条件我加上了i<=mid,没加i<j,这样是完全错误的;因为我们移动元素了,所以前半段不能限制到mid;
* 我认为i<j是应该想到的,只需要这一个就够了,如果我每天都还AC的话或许就会记得这个条件。
*/
for(i=0,j=mid+1;i<j&&j<=num;) {
if(a[i]<=a[j]) {
i++;
}else {
int tempVal = a[j];
for(int k=j-1; k>=i; k--) {
a[k+1] = a[k];
}
a[i] = tempVal;
j++;
/*
* 这个自加条件不能放到if else后面,这样的话如果if里面i++了,然后又i++了
*/
i++;
}
}
}
}
百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序的更多相关文章
- [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...
- 【分分钟内搭建一个带用户系统的博客程序(一)用户系统】asp.net core的Identity真香,EF真香!
不用不知道,一用香到爆. 老哥是个屌丝前端,但也想写点web应用耍一耍.之前弄过了NodeJs,也弄过JAVA,最近由于写游戏的原因用C#,索性上手一波asp.net core. 这篇博客记录的是,如 ...
- Java中数组Arrays.binarySearch,快速查找数组内元素位置
在数组中查找一个元素,Arrays提供了一个方便查询的方法.Arrays.binarySearch(): 测试列子: public class MainTestArray { public stati ...
- bash内置命令mapfile:读取文件内容到数组
bash提供了两个内置命令:readarray和mapfile,它们是同义词.它们的作用是从标准输入读取一行行的数据,然后每一行都赋值给一个数组的各元素.显然,在shell编程中更常用的是从文件.从管 ...
- MongoDB查询内嵌数组(限定返回符合条件的数组中的数据)(1)
https://blog.csdn.net/bicheng4769/article/details/79579830 项目背景 最近在项目中使用mongdb来保存压测结果中的监控数据,那么在获取监控数 ...
- JavaScript中的内置对象-8--1.Array(数组)-Array构造函数; 数组的栈方法; 数组的转换方法; 数组的操作方法; 删除-插入-替换数组项; ECMAScript为数组实例添加的两个位置方法;
JavaScript内置对象-1Array(数组) 学习目标 1.掌握任何创建数组 2.掌握数值元素的读和写 3.掌握数组的length属性 如何创建数组 创建数组的基本方式有两种: 1.使用Arra ...
- Android学习之——如何将GridView内嵌在ScrollView中
最近在做一个项目,有一个需求是在ScrollView中内嵌一个GridView. 刚开始,我是以为能直接内嵌在里面: <ScrollView android:layout_width=" ...
- 百度前端学院js课堂作业合集+分析(更新中...)
第一课:简陋的登录框 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- PHP方便快捷的将二维数组中元素的某一列值抽离出来作为此二维数组内元素的key
得益于PHP的强大的内置数组函数array_column();array_combine(); 举个小栗子: <?php // 先查询出用户的基本信息 $userArray = [['id' = ...
随机推荐
- Cookie的属性(cookie的设置、获取和删除)
每个cookie都有四个可选的属性,他们分别控制cookie的生存周期.可见性.安全性等. Cookies最初设计时,是为了CGI编程.但是,我们也可以使用Javascript脚本来操纵cookies ...
- videojs 动态加载视频
VideoJS dynamic source change via RESTful API 'Undefined' issue with changing RTMP source on compres ...
- 20150503-struts2入门-标签
一.几个标签介绍 1.property标签 property标签用于输出指定值: <s:set name="name" value="'kk'" /> ...
- 阻止子View获取焦点方法
android:descendantFocusability:ViewGroup ep: android:descendantFocusability=blocksDescendants
- Android richtext
在项目开发过程中经常会遇到很多需要显示不同样式的,不同风格的文本信息:对此可以使用多个TextView来分别设置自已想要的样式以满足需求,但是使用多个TextView的方式不太好:使用多个TextVi ...
- [转载]sql server 等待类型
下表列出各任务所遇到的等待类型. 等待类型 说明 ASYNC_DISKPOOL_LOCK 当尝试同步并行的线程(执行创建或初始化文件等任务)时出现. ASYNC_IO_COMPLETION 当某任务正 ...
- Loadrunner测试json接口
1. loadrunner + json说明 使用lr测试json接口,向服务端发送json格式请求,接收处理返回响应数据. 主要用到函数: 1)web_custon_request 2)web_re ...
- iOS类似QQ好友展开和合并列表的实现代码
其实原理就是好友列表合上的时候,将这组的cell数设置为0,展开的时候,在变成原来的,就是这么简单 -(); }
- linux 和 windows下的程序计时
Windows 使用<windows.h>中的GetTickCount(),该函数获得从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD. 转自:http://w ...
- ubuntu lua安装
#解压 tar -xzvf lua5.2.2.tar.gz #进入lua5.2.2文件夹 cd lua5.2.2 #执行make sudo make linux #提示如下错误: #lua.c:67: ...