算法-求两个有序数组两两相加的值最小的K个数
我的思路是:
用队列, 从(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个数相关推荐
- [leetcode] 4 寻找两个有序数组的中位数(二分+递归查找第K小数)(重要)
问题描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 n ...
- 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...
- 代码随想录算法训练营Day02 | LeetCode977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II
LeetCode977. 有序数组的平方 题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 思路:看到题目的第一想法是使用暴力法 ...
- Algs4-1.4.12找出两个有序数组的公共元素-方法1
1.4.12编写一个程序,有序打印给定的两个有序数组(含有N个int值)中的所有公共元素,程序在最坏情况下所需的运行时间应该和N成比. 答: import java.util.Arrays; publ ...
- Java实现 LeetCode 88 合并两个有序数组
88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...
- 窥探算法之美妙——寻找数组中最小的K个数python中巧用最大堆
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...
- 伍六七带你学算法 入门篇-最小的k个数
java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...
- 【算法】剑指 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 ...
- 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素
一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...
- Leetcode算法题:两个有序数组求中位数
Leetcode算法题:两个有序数组求中位数 要求时间复杂度为O(log(m+n)) 思路: 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n) 由于两个数组已经排好序,可一边排序一边 ...
最新文章
- Vuex源码学习(五)加工后的module
- SVN switch 用法详解 (ZZ)
- 12C OCP 1Z0-063 题库(8月以前)
- 《程序出错后,程序员给测试人员的20条高频回复》
- 轻舟智航发布Driven-by-QCraft第三代自动驾驶硬件方案
- g20曲线拟合源码解读
- 三次贝塞尔曲线平滑多边形
- syslog 华为 服务器_删除华为云服务器自带的探针
- spark reduceByKey源码解析
- (四)、jave2加工视频
- 高速EDA设计课程报告(三)
- 小米手机获取root权限最常见问题
- 聊天服务器项目报告,网络聊天室实现报告
- matlab连通区域统计,MATLAB bwlabel函数 统计连通区域
- 多图片上传插件webuploader
- Sketch Nyquist plot 徒手绘制Nyquist 曲线
- VUE强制渲染,强制更新
- Mysql中的索引原理
- 鲁棒性、泛化的解释和区别
- vue通用后台管理(登录页面)
热门文章
- JSP中request内置对象
- Futter基础第6篇: 实现网格布局【GridView、GridView.count、GridView.builder】
- L1-014 简单题 (5 分)—团体程序设计天梯赛
- Android电池管理系统系统分析
- ubuntu下搭建tftp服务器并且验证功能
- ReocketMq常用命令
- 爬虫笔记(四)------关于BeautifulSoup4解析器与编码
- 关于iphone中微信无法调用百度api的解决方案
- Pascal数据结构与算法
- 关于Microsoft Enterprise Library的介绍