lintcode 552 · 创建最大数 【算法 数组 贪心 hard】

题目

https://www.lintcode.com/problem/552/description

描述
给出两个长度分别是m和n的数组来表示两个大整数,数组的每个元素都是数字0-9。从这两个数组当中选出k个数字来创建一个最大数,其中k满足k <= m + n。选出来的数字在创建的最大数里面的位置必须和在原数组内的相对位置一致。返回k个数的数组。你应该尽可能的去优化算法的时间复杂度和空间复杂度。样例
样例 1:输入:nums1 = [3, 4, 6, 5], nums2 = [9, 1, 2, 5, 8, 3],k = 5
输出:[9, 8, 6, 5, 3]
解释:
从第一个数组选择[6, 5],从第二个数组选择[9, 8, 3]
样例 2:输入:nums1 = [6, 7], nums2 = [6, 0, 4],k = 5
输出:[6, 7, 6, 0, 4]
解释:
从第一个数组选择[6, 7],从第二个数组选择[6, 0, 4]
样例 3:输入:nums1 = [3, 9], nums2 = [8, 9],k = 3
输出:[9, 8, 9]
解释:
从第一个数组选择[9],从第二个数组选择[8, 9]

 //思路: 左边选i个,右边选k - i个,merge出最大的/*参考:C++答案地址:https://blog.csdn.net/qq_31552435/article/details/52216546比较双端队列【具有队列,栈的特性】 大小的逻辑https://blog.csdn.net/Olivia_CFS/article/details/121596084和C++答案这篇博客不同的是,java判断两个LinkedList的大小,需要自己写而C++ 的vector本身就是可比较的

答案

public class Solution {/*** @param nums1: an integer array of length m with digits 0-9* @param nums2: an integer array of length n with digits 0-9* @param k: an integer and k <= m + n* @return: an integer array*/public int[] maxNumber(int[] nums1, int[] nums2, int k) {//思路: 左边选i个,右边选k - i个,merge出最大的/*参考:C++答案地址:https://blog.csdn.net/qq_31552435/article/details/52216546比较双端队列【具有队列,栈的特性】 大小的逻辑https://blog.csdn.net/Olivia_CFS/article/details/121596084和C++答案这篇博客不同的是,java判断两个LinkedList的大小,需要自己写而C++ 的vector本身就是可比较的*/int len1 = nums1.length, len2 = nums2.length;int start = Math.max(k - len2, 0);int end = Math.min(k, len1);LinkedList<Integer> path = null;for (int k1 = start; k1 <= end; k1++) {LinkedList<Integer> path1 = f(nums1, k1);LinkedList<Integer> path2 = f(nums2, k - k1);// System.out.println("path1:" + path1);//System.out.println("path2:" + path2);LinkedList<Integer> cmp = connect(path1, path2);// System.out.println("cmp: " + cmp);//System.out.println("path:" + path);if (path != null) {for (int i = 0; i < cmp.size(); i++) {if (path.get(i) != cmp.get(i)) {if (cmp.get(i) > path.get(i)) {path = cmp;}break;}}} else {path = cmp;}}if(path.size()>0 && path.get(path.size()-1) ==null){path.removeLast();}int[] ans = new int[path.size()];for (int i = 0; i < path.size(); i++) {ans[i] = path.get(i);}return ans;}/*·输入数据[1,6,5,4,7,3,9,5,3,7,8,4,1,1,4][4,3,1,3,5,9]21输出数据[4,3,1,6,5,4,7,3,9,5,3,7,8,4,1,1,4,1,3,5,9]期望答案[4,3,1,6,5,4,7,3,9,5,3,7,8,4,1,3,5,9,1,1,4]*/public static LinkedList<Integer> connect(LinkedList<Integer> ll1, LinkedList<Integer> ll2) {//https://blog.csdn.net/Olivia_CFS/article/details/121596084,比较逻辑参考C++代码LinkedList<Integer> ll = new LinkedList<>();while (ll1.size() + ll2.size() > 0) {//参考:https://blog.csdn.net/Olivia_CFS/article/details/121596084//检查ll1,ll2谁更大while (ll1.isEmpty() && !ll2.isEmpty())ll.add(ll2.pollFirst());while (!ll1.isEmpty() && ll2.isEmpty())ll.add(ll1.pollFirst());int max =1;int i1 =0,i2 =0;boolean findMax = false;int n1 = ll1.size(),n2 =ll2.size();while (i1<n1 && i2 <n2){if(ll2.get(i2) >ll1.get(i1)){max =2;findMax =true;break;}else if(ll2.get(i2) < ll1.get(i1)){max =1;findMax =true;break;}else{i1++;i2++;}}//对于有的测试用例;这里很关键if(findMax){ //如果找到最大的了,比如  ll1= 1 2 3 4  和 ll2=1 2 4  ,ll2更大if(max ==1)ll.add(ll1.pollFirst());if(max ==2)ll.add(ll2.pollFirst());}else{//没有找到更大的,比如  ll1= 1 2 3  ll2= 1 2 3 4   那么ll2 更大if(n1>n2)ll.add(ll1.pollFirst());else ll.add(ll2.pollFirst());}}return ll;}public static LinkedList<Integer> f(int[] nums, int k) {int drop = nums.length - k;LinkedList<Integer> ll = new LinkedList<>();for (int num : nums) {while (drop > 0 && ll.size() > 0 && ll.peekLast() < num) {ll.removeLast();drop--;}ll.add(num);}while (ll.size() > k) {ll.removeLast();}return ll;}}

本地测试代码

public class LC552 {public static int[] maxNumber(int[] nums1, int[] nums2, int k) {//思路: 左边选i个,右边选k - i个,merge出最大的/*参考:C++答案地址:https://blog.csdn.net/qq_31552435/article/details/52216546比较双端队列【具有队列,栈的特性】 大小的逻辑https://blog.csdn.net/Olivia_CFS/article/details/121596084和C++答案这篇博客不同的是,java判断两个LinkedList的大小,需要自己写而C++ 的vector本身就是可比较的*/int len1 = nums1.length, len2 = nums2.length;int start = Math.max(k - len2, 0);int end = Math.min(k, len1);LinkedList<Integer> path = null;for (int k1 = start; k1 <= end; k1++) {LinkedList<Integer> path1 = f(nums1, k1);LinkedList<Integer> path2 = f(nums2, k - k1);// System.out.println("path1:" + path1);//System.out.println("path2:" + path2);LinkedList<Integer> cmp = connect(path1, path2);// System.out.println("cmp: " + cmp);//System.out.println("path:" + path);if (path != null) {for (int i = 0; i < cmp.size(); i++) {if (path.get(i) != cmp.get(i)) {if (cmp.get(i) > path.get(i)) {path = cmp;}break;}}} else {path = cmp;}}if(path.size()>0 && path.get(path.size()-1) ==null){path.removeLast();}int[] ans = new int[path.size()];for (int i = 0; i < path.size(); i++) {ans[i] = path.get(i);}return ans;}/*·输入数据[1,6,5,4,7,3,9,5,3,7,8,4,1,1,4][4,3,1,3,5,9]21输出数据[4,3,1,6,5,4,7,3,9,5,3,7,8,4,1,1,4,1,3,5,9]期望答案[4,3,1,6,5,4,7,3,9,5,3,7,8,4,1,3,5,9,1,1,4]*/public static LinkedList<Integer> connect(LinkedList<Integer> ll1, LinkedList<Integer> ll2) {//https://blog.csdn.net/Olivia_CFS/article/details/121596084,比较逻辑参考C++代码LinkedList<Integer> ll = new LinkedList<>();while (ll1.size() + ll2.size() > 0) {//参考:https://blog.csdn.net/Olivia_CFS/article/details/121596084//检查ll1,ll2谁更大while (ll1.isEmpty() && !ll2.isEmpty())ll.add(ll2.pollFirst());while (!ll1.isEmpty() && ll2.isEmpty())ll.add(ll1.pollFirst());int max =1;int i1 =0,i2 =0;boolean findMax = false;int n1 = ll1.size(),n2 =ll2.size();while (i1<n1 && i2 <n2){if(ll2.get(i2) >ll1.get(i1)){max =2;findMax =true;break;}else if(ll2.get(i2) < ll1.get(i1)){max =1;findMax =true;break;}else{i1++;i2++;}}//对于有的测试用例;这里很关键if(findMax){ //如果找到最大的了,比如  ll1= 1 2 3 4  和 ll2=1 2 4  ,ll2更大if(max ==1)ll.add(ll1.pollFirst());if(max ==2)ll.add(ll2.pollFirst());}else{//没有找到更大的,比如  ll1= 1 2 3  ll2= 1 2 3 4   那么ll2 更大if(n1>n2)ll.add(ll1.pollFirst());else ll.add(ll2.pollFirst());}}return ll;}public static LinkedList<Integer> f(int[] nums, int k) {int drop = nums.length - k;LinkedList<Integer> ll = new LinkedList<>();for (int num : nums) {while (drop > 0 && ll.size() > 0 && ll.peekLast() < num) {ll.removeLast();drop--;}ll.add(num);}while (ll.size() > k) {ll.removeLast();}return ll;}public static void main(String[] args) {test99();//test99ok();// test1();//test2();// test3();//test4();}public static void test99() {int[] nums1 =arr99, nums2 = arr100;int k1 = k99;int[] data1 = maxNumber(nums1, nums2, k1);for (int i : data1) {System.out.print(i + ",");}System.out.println();int[] nums11 =arr99, nums21 = arr100;int k11 = k99;int[] data11 = new Solution().maxNumber(nums11, nums21, k11);for (int i : data11) {System.out.print(i + ",");}int n = data1.length;int incr = 0;for (int i = 0; i < n; i++) {if (data1[i] != data11[i]) {System.out.println(i + "  正确:" + data11[i]+"  当前:"+ data1[i]);if (incr++ == 3)break;}}}public static void test99ok() {int[] nums1 =arr99, nums2 = arr100;int k1 = k99;int[] data1 = new Solution().maxNumber(nums1, nums2, k1);for (int i : data1) {System.out.print(i + ",");}System.out.println();}public static void test1() {int[] nums1 = {3, 4, 6, 5}, nums2 = {9, 1, 2, 5, 8, 3};int k1 = 5;int[] data1 = maxNumber(nums1, nums2, k1);for (int i : data1) {System.out.print(i + " ");}System.out.println();}public static void test2() {int[] nums1 = {6, 7}, nums2 = {6, 0, 4};int k1 = 5;int[] data1 = maxNumber(nums1, nums2, k1);for (int i : data1) {System.out.print(i + " ");}System.out.println();}public static void test3() {int[] nums1 = {3, 9}, nums2 = {8, 9};int k1 = 3;int[] data1 = maxNumber(nums1, nums2, k1);for (int i : data1) {System.out.print(i + " ");}System.out.println();}public static void test4() {int[] nums1 = {1, 6, 5, 4, 7, 3, 9, 5, 3, 7, 8, 4, 1, 1, 4}, nums2 = {4, 3, 1, 3, 5, 9};int k1 = 21;int[] data1 = maxNumber(nums1, nums2, k1);for (int i : data1) {System.out.print(i + " ");}System.out.println();}static int[] arr99 =  {2,0,2,1,2,2,2,2,0,1,0,0,2,0,2,0,2,1,0,1,1,0,1,0,1,2,1,1,1,0,1,2,2,1,0,0,1,2,1,2,2,1,1,0,1,2,0,2,0,1,2,0,2,1,1,1,2,0,0,1,0,2,1,2,0,1,0,0,0,1,2,1,0,1,1,2,0,2,2,0,0,1,1,2,2,1,1,2,2,1,0,1,2,0,1,2,2,0,0,0,2,0,2,0,2,2,0,1,1,1,1,2,2,2,2,0,0,2,2,2,2,0,2,0,1,0,0,2,1,0,0,2,0,2,1,1,1,1,0,1,2,0,2,1,0,1,1,1,0,0,2,2,2,0,2,1,1,1,2,2,0,0,2,2,2,2,2,0,2,0,2,0,2,0,0,1,0,1,1,0,0,2,1,1,2,2,2,1,2,2,0,0,2,1,0,2,1,2,1,1,1,0,2,0,1,1,2,1,1,0,0,1,0,1,2,2,2,0,2,2,1,0,1,2,1,2,0,2,2,0,1,2,2,1,2,2,1,1,2,2,2,2,2,1,2,0,1,1,1,2,2,2,0,2,0,2,0,2,1,1,0,2,2,2,1,0,2,1,2,2,2,0,1,1,1,1,1,1,0,0,0,2,2,0,1,2,1,0,0,2,2,2,2,1,0,2,0,1,2,0},arr100={1,1,1,0,0,1,1,0,2,1,0,1,2,1,0,2,2,1,0,2,0,1,1,0,0,2,2,0,1,0,2,0,2,2,2,2,1,1,1,1,0,0,0,0,2,1,0,2,1,1,2,1,2,2,0,2,1,0,2,0,0,2,0,2,2,1,0,1,0,0,2,1,1,1,2,2,0,0,0,1,1,2,0,2,2,0,1,0,2,1,0,2,1,1,1,0,1,1,2,0,2,0,1,1,2,0,2,0,1,2,1,0,2,0,1,0,0,0,1,2,1,2,0,1,2,2,1,1,0,1,2,1,0,0,1,0,2,2,1,2,2,0,0,0,2,0,0,0,1,0,2,0,2,1,0,0,1,2,0,1,1,0,1,0,2,2,2,1,1,0,1,1,2,1,0,2,2,2,1,2,2,2,2,0,1,1,0,1,2,1,2,2,0,0,0,0,0,1,1,1,2,1,2,1,1,0,1,2,0,1,2,1,2,2,2,2,0,0,0,0,2,0,1,2,0,1,1,1,1,0,1,2,2,1,0,1,2,2,1,2,2,2,0,2,0,1,1,2,0,0,2,2,0,1,0,2,1,0,0,1,1,1,1,0,0,2,2,2,2,0,0,1,2,1,1,2,0,1,2,1,0,2,0,0,2,1,1,0,2,1,1,2,2,0,1,0,2,0,1,0};static int k99=      600;static class Solution {/*** @param nums1 an integer array of length m with digits 0-9* @param nums2 an integer array of length n with digits 0-9* @param k     an integer and k <= m + n* @return an integer array*/public int[] maxNumber(int[] nums1, int[] nums2, int k) {// Write your code hereif (k == 0)return new int[0];int m = nums1.length, n = nums2.length;if (m + n < k) return null;if (m + n == k) {int[] results = merge(nums1, nums2, k);return results;} else {int max = m >= k ? k : m;int min = n >= k ? 0 : k - n;int[] results = new int[k];for (int i = 0; i < k; ++i)results[i] = -0x7ffffff;for (int i = min; i <= max; ++i) {int[] temp = merge(getMax(nums1, i), getMax(nums2, k - i), k);results = isGreater(results, 0, temp, 0) ? results : temp;}return results;}}private int[] merge(int[] nums1, int[] nums2, int k) {int[] results = new int[k];if (k == 0) return results;int i = 0, j = 0;for (int l = 0; l < k; ++l) {results[l] = isGreater(nums1, i, nums2, j) ? nums1[i++] : nums2[j++];}return results;}private boolean isGreater(int[] nums1, int i, int[] nums2, int j) {for (; i < nums1.length && j < nums2.length; ++i, ++j) {if (nums1[i] > nums2[j])return true;if (nums1[i] < nums2[j])return false;}return i != nums1.length;}private int[] getMax(int[] nums, int k) {if (k == 0)return new int[0];int[] results = new int[k];int i = 0;for (int j = 0; j < nums.length; ++j) {while (nums.length - j + i > k && i > 0 && results[i - 1] < nums[j])i--;if (i < k)results[i++] = nums[j];}return results;}}}
/*
366 ms
时间消耗
·
21.32 MB
空间消耗
·
输入数据
[1,6,5,4,7,3,9,5,3,7,8,4,1,1,4]
[4,3,1,3,5,9]
21
输出数据
[4,3,1,6,5,4,7,3,9,5,3,7,8,4,1,1,4,1,3,5,9]
期望答案
[4,3,1,6,5,4,7,3,9,5,3,7,8,4,1,3,5,9,1,1,4]*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/79926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四川百幕晟科技:提升店铺质量方法是什么?

抖店是抖音旗下的移动电子商务平台&#xff0c;为商家提供在线销售和促销的机会。在抖店&#xff0c;经验值是商家评价和信誉的重要指标之一。反映了平台上商户的服务质量和用户满意度。那么&#xff0c;如何查看自己在抖店手机上的体验分数呢&#xff1f; 1、如何查看抖店手机…

Eclipse 安装串口终端工具

Eclipse已集成串口终端显示&#xff0c;只需要我们自己下载安装即可使用。使用SSH连接也差不多。 查看eclipse版本信息 help->About Eclipse 查看version&#xff0c;我的是4.7.3a&#xff0c;记住代号&#xff0c;我的是“Oxygen”,下面有用。 安装eclipse自带的“Termin…

Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka)

Spring Cloud(Finchley版本)系列教程(一) 服务注册与发现(eureka) 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 如有错误恳请大家批评指正,与大家共同学习、一起成长,万分感谢。 一、构建环境 Spring Cloud的构建工具可以使用Maven或Gr…

FPGA实现Cordic算法——向量模式

FPGA实现Cordic算法——向量模式 FPGA实现Cordic算法——向量模式1.cordic算法基本原理2.FPGA实现cordic算法向量模式i、FPGA串行实现cordicii、FPGA流水线实现cordiciii、实验结果 FPGA实现Cordic算法——向量模式 1.cordic算法基本原理 FPGA中运算三角函数&#xff0c;浮点数…

初见QT,控件的基本应用,实现简单登录窗口

窗口实现代码 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口设置this->setFixedSize(538, 373); //固定窗口大小this->setWindowIcon(QIcon("G:\\QT_Icon\\windos_icon2.png"))…

多图片展示弹窗插件

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>图片预览完善</title><style>/*** Created by WangCheng on 2020/9/24.*//*背景框*/.mask-layer * {padding: 0;margin: 0;box-sizing: border-box;}.mask-laye…

pytorch-lightning的trainer的optimaze_step的详细分析

on_train_batch_startoptimaze_step training_stepon_before_zero_gradscaler.scale(loss) 将loss放大on_before_backwardmodel.backward 梯度反传on_after_backwardscaler.unscale_(optimizer) 将grad还原on_before_optimizer_step_clip_gradients梯度裁剪scaler.step(optimiz…

肖sir__mysql之三表__008

mysql之三表 create table student( stu_no int, stu_name varchar(10), sex char(1), age int(3), edit varchar(20) ) DEFAULT charsetutf8; insert into student values (1,‘wang’,‘男’,21,‘hello’), (2,‘小明’,‘女’,22,‘haha2’), (3,‘hu’,‘女’,23,‘haha3…

Fast-DDS 服务发现简要概述

阅读本文章需要对DDS基础概念有一些了解&#xff0c;一些内容来自Fast-DDS官方文档&#xff0c;一些是工作中踩过的坑。 1. 服务发现阶段 满足OMG标准的DDS服务发现分为两部分&#xff0c;分别是: PDP(Participant Discovery Protocol 参与者发现协议)&#xff1a;参与者确认…

豆瓣图书评分数据的可视化分析

导语 豆瓣是一个提供图书、电影、音乐等文化产品的社区平台&#xff0c;用户可以在上面发表自己的评价和评论&#xff0c;形成一个丰富的文化数据库。本文将介绍如何使用爬虫技术获取豆瓣图书的评分数据&#xff0c;并进行可视化分析&#xff0c;探索不同类型、不同年代、不同…

第13节-PhotoShop基础课程-裁剪工具

文章目录 前言1.裁剪工具1.基本操作 Alt Shift2.拉直3.内容识别 自动填充 2.透视裁剪工具3.切片工具-长图分成多个4.切片选择工具5. 存储为一张一张 前言 1.裁剪工具 1.基本操作 Alt Shift 2.拉直 可以矫正图片 3.内容识别 自动填充 2.透视裁剪工具 可以拉正图片 3.切片工具-…

得物Java开发面试题

1. Java类加载&#xff0c;如何打破双亲委派&#xff1f; 创建自定义类加载器&#xff1a;创建一个新的类加载器类&#xff0c;继承自 ClassLoader 或其任何已有的子类。 重写 loadClass 方法&#xff1a;在你的自定义类加载器中重写 loadClass 方法。 加载类数据&#xff1a…

Spring系列文章:Spring中的设计模式

一、简单⼯⼚模式 BeanFactory的getBean()⽅法&#xff0c;通过唯⼀标识来获取Bean对象。是典型的简单⼯⼚模式&#xff08;静态⼯⼚模 式&#xff09;&#xff1b; 二、⼯⼚⽅法模式 FactoryBean是典型的⼯⼚⽅法模式。在配置⽂件中通过factory-method属性来指定⼯⼚⽅法&a…

Python中进行特征重要性分析的9个常用方法

特征重要性分析用于了解每个特征(变量或输入)对于做出预测的有用性或价值。目标是确定对模型输出影响最大的最重要的特征&#xff0c;它是机器学习中经常使用的一种方法。 为什么特征重要性分析很重要? 如果有一个包含数十个甚至数百个特征的数据集&#xff0c;每个特征都可能…

发现某设备 adb shell ps 没有输出完整信息

某错误示例 并不是都使用 -ef 参数查找都能够返回完整信息&#xff0c;某些版本设备不适用 -ef 也不会返回完整信息。 简单兼容 简单兼容不同版本 Android 设备查找进程列表&#xff0c;没有通过脚本判断 Android 版本&#xff0c;如有兴趣可以自己修改。 :loop adb shell…

在测试过程中引入可观测性平台提升业务质量

作者 观测云 产品技术专家 成都办公室 - 刘跃兰 前言 随着微服务技术的发展&#xff0c;微服务概念已深入人心&#xff0c;越来越多的企业开始使用微服务架构来开发业务应用。业务应用系统的整体架构变得更加复杂&#xff0c;并存在各种各样的不确定性因素&#xff0c;从而对…

小节8:Python之文件操作

1、文件在哪里&#xff1f; 如果用代码对文件进行操作&#xff0c;需要先找到那个文件 MacOS/Linux&#xff1a;斜杠/ 表示根目录&#xff0c;一切的文件、目录都存放在根目录下面。 Windows系统&#xff1a;就不一样了&#xff0c;它每一个磁盘分区都有自己的根目录&#x…

01-Redis核心数据结构与高性能原理

上一篇&#xff1a; 1.Redis安装 下载地址&#xff1a;http://redis.io/download 安装步骤&#xff1a; # 安装gcc yum install gcc# 把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下&#xff0c;并解压 wget http://download.redis.io/releases/redis-5.0.3.tar.gz…

[C++入门]---List的使用及模拟实现

文章目录 1.list的介绍2.list的使用2.1list的构造函数2.2list modifiers2.3list capacity2.4list elment access2.5iterator的使用 3.list的模拟实现3.1list的源码 1.list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向…

利用WebStorm开发react——本文来自AI创作助手

要在WebStorm中开发React应用程序&#xff0c;请按照以下步骤进行设置&#xff1a; 1.安装Node.js和npm&#xff08;如果尚未安装&#xff09;。 2.下载和安装WebStorm。 3.打开WebStorm&#xff0c;并在欢迎界面中选择“Create New Project”。 4.在弹出窗口中&#xff0c…