百度:在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++;
			}
		}
	}
}

 

 

 

时间: 2024-09-25 07:18:40

百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序的相关文章

百度你是搜索引擎还是站内搜索

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 百度你是搜索引擎还是站内搜索,中国亚龙刚刚在网上习惯性的百度一下我的偶像张学友,前四条信息居然全部是百度自己的网页,百科.mp3.视频\和图片.接着中国亚龙随便搜了几个词,请看下图: 热词基本上前几位都是百度自己的产品,就连我的网名东方醉亮这个基本上没有人搜的词搜出的第三位就是百度帖吧,内容好象和想要搜的毫不相关. 没办法,你是老大. 现在在

百度站长平台lee:谈spider抓取过程中的策略

A5站长网8月22日消息,此前百度站长平台Lee曾分享过关于搜索引擎抓取系统中有关抓取系统基本框架.抓取中涉及的网络协议.抓取的基本过程的内容,今日Lee再次通过百度站长平台分享搜索引擎抓取系统第二部分内容-spider抓取过程中的策略. Lee表示spider在抓取过程中面对着复杂的网络环境,为了使系统可以抓取到尽可能多的有价值资源并保持系统及实际环境中页面的一致性同时不给网站体验造成压力,会设计多种复杂的抓取策略.并简单介绍了抓取过程中涉及到的主要策略类型. 在百度站长平台社区-你问lee答

百度分享将会成为seo的下一个利器

2012年,seo继续火爆,可以预见的是seo将会成为中小企业必争的战场.2012年谁更加重视搜索引擎的作用,谁就会在未来的网络营销中占有优势. 而就在此刻,百度分享逐渐进入了大家的视野.很多朋友现在都非常关心百度分享对网站是否有作用,对网站的排名是否产生影响,分享的次数的多少会不会对网站产生不同的作用.可以说现在也并没用明确的数据证明百度分享的作用,但seo界的主流认识都认为应该是会产生作用的.就像Zac说"Google.Bing等都被证实,排名会受社会化媒体网站中的分享.链接影响.Googl

demos-关于百度地图项目中的BMPAPIDemeMain中的一段代码

问题描述 关于百度地图项目中的BMPAPIDemeMain中的一段代码 private static final DemoInfo[] demos = { new DemoInfo(**_R.string.title_activity_daohang, R.string.title_activity_locationkuaijiwuliu**_, DaohangActivity.class) 星号内的看不懂,我想改为加入中文字该怎么弄?

android-Android中可以在一个activity类里内置一个service类吗

问题描述 Android中可以在一个activity类里内置一个service类吗 我写了一个倒计时的程序,我想让手机关闭屏幕时这个倒计时功能仍能继续,目前我的程序虽然在屏幕关闭时仍能进行倒计时功能,但是屏幕关闭久了这个倒计时功能会停止,设计的倒计时界面也会关闭(虽然这个界面我在一个service中写了一个广播,只要屏幕关闭这个activity就会启动,但屏幕关闭久了倒计时仍会停止),所以我想写个service,让启动倒计时功能的方法长驻,这行不行得通?或者大神们有更好的思路吗? 解决方案 不知

百度只是想让我们seoer进化到一个新高度

摘要: 在早的前几年,seo这项技术开始从国外引进国内,便瞬间变得火爆起来,网上漫天都是外链.复制文章等等这些东西.当时的搜索引擎还不成熟,所以在那段时间seo还是蛮好做的,很多 在早的前几年,seo这项技术开始从国外引进国内,便瞬间变得火爆起来,网上漫天都是外链.复制文章等等这些东西.当时的搜索引擎还不成熟,所以在那段时间seo还是蛮好做的,很多人都在seo行业赚到了一桶金.但随着百度算法的不断完善,seo开始变得举步维艰,以前各种方法都行不通了,因此越来越多人放弃seo,认为seo已经被百度

如何能在微信中内嵌一个web页面

问题描述 如何能在微信中内嵌一个web页面 想问一下如何能在微信公众平台中内嵌一个web页面呢?具体方向是什么呢?本人对这个不太懂.想咨询一下

经典算法(12) 数组中只出现1次的两个数字(百度面试题)

首先来看题目要求: 在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找 出这两个数字. 考虑下这个题目的简化版--数组中除一个数字只出现1次外,其它数字都成对出现 ,要求尽快找出这个数字.这个题目在之前的<位操作基础篇之位操作全面总结>中的"位操作趣味应用" 中就已经给出解答了.根据异或运算的特点,直接异或一次就可以找出这个数字. 现在数组中有两个 数字只出现1次,直接异或一次只能得到这两个数字的异或结果,但光从这个结果肯定无法得到这个两个数字 .因此我

php调用MsSQL存储过程使用内置RETVAL获取过程中的return值

本篇文章是对php调用MsSQL存储过程使用内置RETVAL获取过程中的return值的方法进行了详细的分析介绍,需要的朋友参考下   [PHP代码] 复制代码 代码如下:  $stmt = mssql_init('P__Global_Test', $conn) or die("initialize stored procedure failure");  mssql_bind($stmt, "RETVAL", $returnValue, SQLINT4, true