我的思路是:

用队列,  从(0,0)開始入队,每次出队的时候,选(1,0) (0,1) 之间最小的入队,假设是相等的都入队,假设入过队的就不入了,把出队的k个不同的输出来就可以

我測试了几组数据都是对的。可是可能还是会有BUG,或者我忽略的地方。以下是我的实现代码(假设有错,请大家积极指正)

import java.util.LinkedList;
import java.util.Queue; /**
* 有两个序列 A 和 B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A 和 B 都按升序排列,对于
1<=i,j<=k。求 k 个最小的(ai+bj)。要求算法尽量高效
* @author Administrator
*
*/
public class Test { int k=4;
int a[]=new int[]{1,2,3,4};
int b[]=new int[]{20,30,40,50};
boolean visited[]=new boolean[k*k];
int count=1,empty=a[0]+b[0]-1;
Queue<Data> queue=new LinkedList<Data>();
int result[]=new int[k];
class Data{
public int x,y,value;
public Data(int x,int y)
{
this.x=x;
this.y=y;
this.value=a[x]+b[y];
}
}
void main() {
for(int i=0;i<k*k;i++)
visited[i]=false;
queue.add(new Data(0, 0));
visited[0]=true;
result[count-1]=a[0]+b[0];
while(!queue.isEmpty())
{
Data data=queue.poll();
int t1=empty,t2=empty;//t1 t2初始为比最小还小的方便后面比較
if(data.value!=result[count-1])
{
result[count]=data.value;
if(++count==k)
break;
}
if(data.x+1<k && (!visited[(data.x+1)*k+data.y]))
{
t1=a[data.x+1]+b[data.y];
visited[(data.x+1)*k+data.y]=true;
}
if(data.y+1<k && (!visited[(data.x)*k+data.y+1]))
{
t2=a[data.x]+b[data.y+1];
visited[(data.x)*k+data.y+1]=true;
}
if((t1<t2&&t1!=empty) || (t1!=empty&&t2==empty) || (t1==t2 &&t1!=empty))
{
queue.add(new Data(data.x+1, data.y));
}
if((t1>t2&&t2!=empty) || (t2!=empty&&t1==empty) || (t1==t2 &&t2!=empty))
{
queue.add(new Data(data.x, data.y+1));
}
}
for(int i=0;i<count;i++)
{
System.out.print(result[i]+" ");
}
}
public static void main(String[] args)
{
new Test().main();
} }

详细分析请见这个博文

http://blog.csdn.net/sunnianzhong/article/details/8932374

上面写道有三种方法,1:暴力 ,2:快排, 3:堆排

而我的方法,并没有排序,由于他本身有序,我仅仅是依据规律通过队列入队出队来剪掉不必要的路径。由于没有大量的数据验证,可能会有错误。

我用简单的数字举例是能通过的。

算法-求两个有序数组两两相加的值最小的K个数的更多相关文章

  1. 算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组

    1.x的平方根 java (1)直接使用函数 class Solution { public int mySqrt(int x) { int rs = 0; rs = (int)Math.sqrt(x ...

  2. python3实现合并两个有序数组

    很早就听同学和师兄经常说刷题很重要,然而编程能力一直都很渣的我最近才开始从leetcode的初级算法开始.今天遇到的这道题虽然很简单,因为是头一次用自己的方法速度还不错,特此记录一下,还大神们请不要嘲 ...

  3. leetcode-只出现一次的数字合并两个有序数组

    题目:合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素 ...

  4. Leetcode 88 合并两个有序数组 Python

    合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分 ...

  5. leetcode 88. C++ 合并两个有序数组

    Leetcode 88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 ...

  6. Java实现 LeetCode 88 合并两个有序数组

    88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...

  7. 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  8. 算法笔记_035:寻找最小的k个数(Java)

    目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...

  9. 找到数组中最小的k个数

    /*输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字, 则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k = ...

随机推荐

  1. CSS选择器:#id和.class中间有空格和无空格的区别

    相信大家都知道 .class1 .class2 和 .class1.class2 是两种不同的选择规则,但具体怎样不同呢? 首先中间有空格的情况:是选择到.class1类下的.class2类子节点,即 ...

  2. js 数组转json,json转数组

    //数组转json串var arr = [1,2,3, { a : 1 } ];JSON.stringify( arr ); //json字符串转数组var jsonStr = '[1,2,3,{&q ...

  3. HTTP协议教程

    文章内容: 1.HTTP协议概述 2.URL知识概述 3.HTTP消息结构详解 1.HTTP协议概述 定义: 超文本传送协议 (HTTP-Hypertext transfer protocol) 是分 ...

  4. Bitmap到底占多少内存

    转至:Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存? Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟 ...

  5. python装饰器 高阶函数 函数闭包

    1.装饰器: 本质是函数,功能是为其他函数添加附加功能 原则:1.不修改被装饰函数的源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #装饰器格式框架def wrap(func ...

  6. vue2.0中的计算属性

    计算属性是一个很邪门的东西,只要在它的函数里引用了data中的某个属性,当这个属性发生变化的时候,函数仿佛可以嗅探到这个变化,并自动重新执行. 上代码会源源不断的打印出a的值.如果希望b依赖data中 ...

  7. Linux 虚拟机配置-network is unreachable

    配置虚拟机时,遇到network is unreachable,根据网上找来的方法处理,最终自己试过,成功修改的方法在这里记录一下: 修改虚拟机的网络适配器:桥接,复制物理机网络 vim /etc/s ...

  8. new era

    新的博客,将会记录我在工作和学习中遇到的问题以及总结...

  9. PL/SQL编程基础——PL/SQL简介

    课程教师:李兴华 课程学习者:阳光罗诺 日期:2018-07-28 知识点: 1. 了解PL/SQL的主要特点 2. 掌握PL/SQL块的基本结构 PL/SQL PL/SQL是Oracle在关系数据库 ...

  10. Python初学者第十二天 购物车程序小作业

    12day 作业题目: 购物车程序 作业需求: 数据结构: goods = [ {"name": "电脑", "price": 1999}, ...