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 的元素数量分 ...
随机推荐
- asp.net高并发网站解决方案【未完成版本】
场景:假设现在是一个电商网站,今天要举办活动,有10个商品低价销售,但是会来抢购的人会特别多,最后只有十个人可以成功的买到商品 明确2个问题 1.访问量:抢票时间断用户访问量 2.并发:1秒内请求 ...
- Too many parameters: expected 1, was given 2 Query: SELECT count(id) FROM `user` WHERE username = ?; Parameters: [org.apache.commons.dbutils.handlers.ScalarHandler@453da22c, [李明]]
public Object getValue(String sql,Object... args) { Connection conn = null; Object obj= null; try { ...
- JAVA-数组或集合
哈哈,今天我们来讲解一下有关于一些数组 或者是集合的知识点 1.ArrayList,LinkedList,Vector的区别 ArrayList,LinkedList,Vector都是实现List接口 ...
- spark练习--mysql的读取
前面我们一直操作的是,通过一个文件来读取数据,这个里面不涉及数据相关的只是,今天我们来介绍一下spark操作中存放与读取 1.首先我们先介绍的是把数据存放进入mysql中,今天介绍的这个例子是我们前两 ...
- 【转帖】置高并发jdbc连接池
简单的MySQL连接池 <Resource type="javax.sql.DataSource" name="jdbc/TestDB" factory= ...
- 19,Ubuntu安装之python开发
什么??公司要用Ubuntu(乌班图)?不会用??怎么进行python开发??? 乌班图操作系统下载地址:http://releases.ubuntu.com/18.04/ubuntu-18.04 ...
- Docker构建nginx+uwsgi+flask镜像(一)
前言 笔者之前是从事Java方面的工作,自从18年5月左右来到新的公司,接触到Python,被其简单优雅的语法风格深深吸引,同时,新公司也帮助笔者打开Docker世界的大门,让笔者体会到“一次打包,到 ...
- pg数据库数据表异常挂起
pg数据库即是PostgreSQL数据库. 前几天在一个Java项目中,出现运行Java程序后,pg数据库的数据表异常挂起.而且是在某台电脑上出现的,重装数据库也没用,其它电脑未能复现,是个很奇怪的现 ...
- oracle集群部署相关文章
1. Oracle数据库HA架构方案介绍:http://blog.sina.com.cn/s/blog_7273b6cc0100p0sr.html 2.Oracle 集群概念和原理
- python-使用unittest和ddt实现数据驱动
一.数据驱动的概念 相同测测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式成为数据驱动.测试框架使用unittest 和ddt模块相结合的方式 二.unittest ...