我的思路是:

用队列,  从(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. [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)

    问题描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...

  2. 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方

    一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...

  3. 代码随想录算法训练营Day02 | LeetCode977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

    LeetCode977. 有序数组的平方 题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 思路:看到题目的第一想法是使用暴力法 ...

  4. Algs4-1.4.12找出两个有序数组的公共元素-方法1

    1.4.12编写一个程序,有序打印给定的两个有序数组(含有N个int值)中的所有公共元素,程序在最坏情况下所需的运行时间应该和N成比. 答: import java.util.Arrays; publ ...

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

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

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

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

  7. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

  8. 【算法】剑指 Offer 40. 最小的k个数 【重刷】

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

  9. 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素

    一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...

  10. Leetcode算法题:两个有序数组求中位数

    Leetcode算法题:两个有序数组求中位数 要求时间复杂度为O(log(m+n)) 思路: 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n) 由于两个数组已经排好序,可一边排序一边 ...

最新文章

  1. Vuex源码学习(五)加工后的module
  2. SVN switch 用法详解 (ZZ)
  3. 12C OCP 1Z0-063 题库(8月以前)
  4. 《程序出错后,程序员给测试人员的20条高频回复》
  5. 轻舟智航发布Driven-by-QCraft第三代自动驾驶硬件方案
  6. g20曲线拟合源码解读
  7. 三次贝塞尔曲线平滑多边形
  8. syslog 华为 服务器_删除华为云服务器自带的探针
  9. spark reduceByKey源码解析
  10. (四)、jave2加工视频
  11. 高速EDA设计课程报告(三)
  12. 小米手机获取root权限最常见问题
  13. 聊天服务器项目报告,网络聊天室实现报告
  14. matlab连通区域统计,MATLAB bwlabel函数 统计连通区域
  15. 多图片上传插件webuploader
  16. Sketch Nyquist plot 徒手绘制Nyquist 曲线
  17. VUE强制渲染,强制更新
  18. Mysql中的索引原理
  19. 鲁棒性、泛化的解释和区别
  20. vue通用后台管理(登录页面)

热门文章

  1. JSP中request内置对象
  2. Futter基础第6篇: 实现网格布局【GridView、GridView.count、GridView.builder】
  3. L1-014 简单题 (5 分)—团体程序设计天梯赛
  4. Android电池管理系统系统分析
  5. ubuntu下搭建tftp服务器并且验证功能
  6. ReocketMq常用命令
  7. 爬虫笔记(四)------关于BeautifulSoup4解析器与编码
  8. 关于iphone中微信无法调用百度api的解决方案
  9. Pascal数据结构与算法
  10. 关于Microsoft Enterprise Library的介绍