博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LintCode题集】Q6、Q64
阅读量:5127 次
发布时间:2019-06-13

本文共 2605 字,大约阅读时间需要 8 分钟。

  最近开始刷LintCode上的题目,先从标签为容易的开始刷。今天刷的这两题目差不多为同一类型的题目,都是为按照一定的规则合并两个已经有序的数组。

  

[Q6]

描述:

  合并两个排序的整数数组A和B变成一个新的数组。

  样例:

  给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]

思路:

  题目的方法原型为:

1 public int[] mergeSortedArray(int[] A, int[] B) {}

  所以即从A和B数组中一次取数比较大小,将其中较小者放入新的数组C。

  当其中一个数组已经全部取出,则将剩余一个数组中的数全部放入数组C中。

  在归并排序中,当把一个序列分解为若干个子序列之后,正是通过递归的合并子序列来完成排序。

实现:

 

1 public int[] mergeSortedArray(int[] A, int[] B) { 2         // Write your code here 3  4         int[] C = new int[A.length + B.length]; 5  6         int indexa = 0;  //表示a数组的索引位置 7         int indexb = 0;  //表示b数组的索引位置 8         int indexc = 0;  //表示c数组的索引位置 9 10         //当某个数组已经全部合并进新的数组的时候跳出循环11         while( ! ((indexa == A.length) || (indexb == B.length))){12             if(A[indexa] <= B[indexb]){13                 C[indexc ++] = A[indexa ++];14             }15             else{16                 C[indexc ++] = B[indexb ++];17 18             }19         }20         //A数组还有剩余元素21         while(indexa < A.length){22             C[indexc ++] = A[indexa ++];23         }24         //B数组还有剩余元素25         while(indexb < B.length){26             C[indexc ++] = B[indexb ++];27         }28 29         return C;30 31 }

 

[Q64]

描述:

  合并两个排序的整数数组A和B变成一个新的数组。

  你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。

  样例:

  给出 A = [1, 2, 3, empty, empty], B = [4, 5]

  合并之后 A 将变成 [1,2,3,4,5]

思路:

  题目的方法原型为:

1 public void mergeSortedArray(int[] A, int m, int[] B, int n) {}

 

  从题目函数原型和题目描述可以看出,这次在合并的时候是在A数组的基础上进行合并,A数组的大小大于或等于A+B的大小,所以可以将B数组合并到A数组中。

  考虑两种情况:

  1 当B中的某个元素已经比A中的最后一个元素还要大时,此时不需要再继续比较了,直接将B中包括当前元素的剩余元素全部插入到A数组最后。

  2 当B中的第x元素通过比较插入到了A数组的y位置上,则第x + 1 元素直接从y + 1 位置开始继续比较,前面的无需比较。

  此题目比上面的题目还要多增加一个步骤,因为是在A数组上进行插入,所以插入之后,插入位置以后的元素需要往后移动一个位置,涉及到一个移动操作。

实现:

1  public void mergeSortedArray(int[] A, int m, int[] B, int n) { 2         int indexa = 0 ;   //  标识A数组的遍历位置 3         int indexb = 0 ;   //标识B数组的遍历位置 4         int lastIndex = m - 1  ;  //标识A数组中最后的位置 5  6         while ( (indexa <= lastIndex) && (indexb <= n - 1) ) { 7             if(B[indexb] < A[indexa]){ 8                 //这个题目第一此提交出现了错误, 错误原因是下面的for循环中应该是i -- ,  手滑写成了 i ++ 9                 for(int i = lastIndex ; i >= indexa ; i --){10                     A[i + 1] = A [i] ;11                 }12                 A[indexa ++] = B[indexb ++];13                 lastIndex ++ ;14             }15             else{16                 indexa ++ ;  17             }18         }19         while(indexb <= n - 1 )  {20             A[++ lastIndex] = B[indexb ++] ;21         }22 }

 

总结:

  有关于数组的操作,大多可以用过设置不同变量,来标识数组中的不同位置,从而可以进行不同的操作。

 

转载于:https://www.cnblogs.com/tancky/p/6574747.html

你可能感兴趣的文章
什么是Joint Escalation Team?
查看>>
Nodejs学习笔记(十四)—Mongoose介绍和入门
查看>>
数据链路层之服务与成帧
查看>>
TensorFlow设置GPU占用量
查看>>
oracle默认用户名及密码
查看>>
notifyDataSetChanged() 动态更新ListView
查看>>
Jquery和一些Html控件
查看>>
图像处理10 RCNN
查看>>
使用PreApplicationStartMethodAttribute
查看>>
【Active入门-2】ActiveMQ学习-生产者与消费者
查看>>
安装Android SDK buildtool 23.0.1仍旧报错
查看>>
Orchard源码分析(6):Shell相关
查看>>
从LLVM源码学C++(二)
查看>>
STRUTS常见面试题
查看>>
datetime
查看>>
一种达到人工批改效果的英语语法自动纠错的方法
查看>>
os模块
查看>>
Jsp:taglib实现
查看>>
Java+Netty实现的RESTful框架--netty-rest-server
查看>>
将十进制数转换为二进制数----不用数组,也不用函数,只用循环
查看>>