java合并两个有序数组的算法(抛砖引玉)
前几天看见一道面试题中要将两个有序数组合并成一个新的有序数组,首先使用了嵌套循环,之后想那样效率太低,又想出了以下思路,和大家分享下,如果有更好的方法,请留言指教:
思路:
1.新建一个数组大小为firArr和secArr之和的数组mergeArr
2.如果fistArr的第一个元素大于等于secArr的最后一个元素,则直接对mergeArr进行元素赋值
3.如果secArr的第一个元素大于secArr的最后一个元素,则直接对mergeArr进行元素赋值
4.若不满足上面两种情况,则需要进行数组拆分
1)设置数组firArr和数组secArr的索引index,初始值都为0
2)循环mergeArr数组
3)如果当前firArr的索引小于firArr数组大小且secArr的索引小于secArr数组的大小,判断firArr、secArr两数组对应位置的元素大小,将值小的数组的那个值赋值给mergeArr,并向后移动一位此数组的index
4)如果当前位置小于firArr或者secArr两数组的大小,进行相应的复制(走到这个循环中,只能表示说,有一个数组已经索引完毕了)
代码如下:
package com.hudai.platform.manager; import java.util.Arrays; /**
* 算法测试 合并两个有序数组到一个数组中
*
* @author WanHongLei
* @version 创建时间:2019年2月13日 上午11:14:13 类说明
*/
public class MergeTester { public static void main(String[] args) throws Exception {
int[] a = { 1, 2, 2, 3, 4, 5 };
int[] b = { 5, 7, 9, 13 }; System.out.println(Arrays.toString(mergeArr(a, b))); } /**
* 思路: 1.新建一个数组大小为firArr和secArr之和的数组mergeArr
* 2.如果fistArr的第一个元素大于等于secArr的最后一个元素,则直接对mergeArr进行元素赋值
* 3.如果secArr的第一个元素大于secArr的最后一个元素,则直接对mergeArr进行元素赋值
* 4.若不满足上面两种情况,则需要进行数组拆分
* 1)设置数组firArr和数组secArr的索引index,初始值都为0
* 2)循环mergeArr数组
* 3)如果当前firArr的索引小于firArr数组大小且secArr的索引小于secArr数组的大小,判断firArr、secArr两数组对应位置的元素大小,将值小的数组的那个值赋值给mergeArr,并向后移动一位此数组的index
* 4)如果当前位置小于firArr或者secArr两数组的大小,进行相应的复制(走到这个循环中,只能表示说,有一个数组已经索引完毕了)
*
* @param firArr
* 第一个数组
* @param secArr
* 第二个数组
* @return 合并之后的数组
*/
private static int[] mergeArr(int[] firArr, int[] secArr) {
int firlen = firArr.length;
int seclen = secArr.length;
int[] mergeArr = new int[firlen + seclen]; if (firArr[0] >= secArr[seclen - 1]) {
for (int i = 0; i < mergeArr.length; i++) {
if (i < seclen) {
mergeArr[i] = secArr[i];
} else {
mergeArr[i] = firArr[i - seclen];
}
}
} else if (secArr[0] >= firArr[firlen - 1]) {
for (int i = 0; i < mergeArr.length; i++) {
if (i < firlen) {
mergeArr[i] = firArr[i];
} else {
mergeArr[i] = secArr[i - firlen];
}
}
} else {
int indexFir = 0, indexSec = 0;
for (int i = 0; i < mergeArr.length; i++) {
if(indexFir < firlen && indexSec < seclen){
if (firArr[indexFir] > secArr[indexSec]) {
mergeArr[i] = secArr[indexSec];
indexSec++;
} else if (firArr[indexFir] < secArr[indexSec]) {
mergeArr[i] = firArr[indexFir];
indexFir++;
}
}else if(indexFir < firlen){
mergeArr[i] = firArr[indexFir];
indexFir++;
}else if(indexSec < seclen){
mergeArr[i] = secArr[indexSec];
indexSec++;
}
}
} return mergeArr;
} }
java合并两个有序数组的算法(抛砖引玉)的更多相关文章
- 算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组
1.x的平方根 java (1)直接使用函数 class Solution { public int mySqrt(int x) { int rs = 0; rs = (int)Math.sqrt(x ...
- Java实现 LeetCode 88 合并两个有序数组
88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...
- leetcode-只出现一次的数字合并两个有序数组
题目:合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素 ...
- python3实现合并两个有序数组
很早就听同学和师兄经常说刷题很重要,然而编程能力一直都很渣的我最近才开始从leetcode的初级算法开始.今天遇到的这道题虽然很简单,因为是头一次用自己的方法速度还不错,特此记录一下,还大神们请不要嘲 ...
- 每日一道 LeetCode (19):合并两个有序数组
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 合并两个有序数组a和b到c
问题:两个有序数组a和b,合并成一个有序数组c. // 合并两个有序数组a和b到c void Merge_Array(int a[], int n, int b[], int m, int c[]) ...
- Leetcode#88. Merge Sorted Array(合并两个有序数组)
题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- 【leetcode-88,21】 合并两个有序数组/链表
合并两个有序数组 (easy,1过) 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nu ...
- Leetcode 88 合并两个有序数组 Python
合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分 ...
随机推荐
- Redis数据库 : python与java操作redis
redis 包 from redis import * 连接: r = StrictRedis(host='localhost', port='6379') 读写:r.set('key','value ...
- MySQL常用命令基础操作
MySQL启动与更改密码 mysql启动基本原理说明: /etc/init.d/mysqld是一个shell启动脚本,启动后最终会调用,mysqld_safe脚本,最后调用mysqld服务启动mysq ...
- Samba和NFS文件共享
SAMBA文件共享服务 通过Yum软件仓库来安装Samba服务程序 [root@zhangjh ~]# yum install samba -y Samba 配置文件注释信息较多,为了便于配置,因此先 ...
- 4,Flask 中的 request
每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...
- 十五、mac 中登陆mysql忘记密码解决办法
mac 中登陆mysql忘记密码解决办法 1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter pa ...
- Struts2---数据封装机制
Struts2属性驱动和模型驱动 自动完成了数据的获取和封装 LoginAction.java public class LoginAction implements ModelDriven<U ...
- 用Mapreduce求共同好友
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs ...
- Trident学习笔记(二)
aggregator ------------------ 聚合动作:聚合操作可以是基于batch.stream.partiton [聚合方式-分区聚合] partitionAggregate 分区聚 ...
- linux下vi的复制,黏贴,删除,撤销,跳转等命令-费元星
前言 在嵌入式linux开发中,进行需要修改一下配置文件之类的,必须使用vi,因此,熟悉 vi 的一些基本操作,有助于提高工作效率. 一,模式vi编辑器有3种模式:命令模式.输入模式.末行模式. ...
- ubuntu上通用解压方式
ubuntu上通用解压方式 tar xvf *.bin.tar.gz,gz,tar.tgz