2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K。 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑。返回所有可能的结果中,代表最大数字的结果。

福大大 答案2021-04-05:

自然智慧想不到,需要练敏感度。

1.动态规划+选元素+双指针的合并。无代码。

2.动态规划+选元素+双指针的DC3合并。有代码。

2.1.dp[i][j],i是数组序号,j是[0,K]的数,dp[i][j]是最优位置。

2.2.从arr1和arr2中选元素。

2.3.合并arr1中的选中的元素和arr2中的选中的元素,采用dc算法。

2.4.返回最大值。

代码用golang编写。代码如下:

package main

import (
"fmt"
"index/suffixarray"
"unsafe"
) func main() {
nums1 := []int{3, 4, 6, 5}
nums2 := []int{9, 1, 2, 5, 8, 3}
k := 5
ret := maxNumber(nums1, nums2, k)
fmt.Println(ret)
}
func maxNumber(nums1 []int, nums2 []int, k int) []int {
len1 := len(nums1)
len2 := len(nums2)
if k < 0 || k > len1+len2 {
return nil
}
res := make([]int, k)
//两个动态规划
dp1 := getdp(nums1)
dp2 := getdp(nums2)
for get1 := getMax(0, k-len2); get1 <= getMin(k, len1); get1++ {
//arr1中挑元素
pick1 := maxPick(nums1, dp1, get1)
//arr2中挑元素
pick2 := maxPick(nums2, dp2, k-get1)
//和并挑的元素
merge := mergeBySuffixArray(pick1, pick2)
//获取最大值
if !moreThan(res, merge) {
res = merge
}
}
return res
}
func moreThan(pre []int, last []int) bool {
i := 0
j := 0
for i < len(pre) && j < len(last) && pre[i] == last[j] {
i++
j++
}
return j == len(last) || (i < len(pre) && pre[i] > last[j])
}
func mergeBySuffixArray(nums1 []int, nums2 []int) []int {
size1 := len(nums1)
size2 := len(nums2)
nums := make([]int, size1+1+size2)
for i := 0; i < size1; i++ {
nums[i] = nums1[i] + 2
}
nums[size1] = 1
for j := 0; j < size2; j++ {
nums[j+size1+1] = nums2[j] + 2
}
all := make([]byte, len(nums))
for i := 0; i < len(nums); i++ {
all[i] = byte(nums[i])
}
dc3 := NewFddSa(all) ans := make([]int, size1+size2)
i := 0
j := 0
r := 0
for i < size1 && j < size2 {
if dc3.Rank[i] > dc3.Rank[j+size1+1] {
ans[r] = nums1[i]
r++
i++
} else {
ans[r] = nums2[j]
r++
j++
}
}
for i < size1 {
ans[r] = nums1[i]
r++
i++
}
for j < size2 {
ans[r] = nums2[j]
r++
j++
}
return ans
}
func maxPick(arr []int, dp [][]int, pick int) []int {
res := make([]int, pick)
for resIndex, dpRow := 0, 0; pick > 0; pick, resIndex = pick-1, resIndex+1 {
res[resIndex] = arr[dp[dpRow][pick]]
dpRow = dp[dpRow][pick] + 1
}
return res
}
func getdp(arr []int) [][]int {
size := len(arr) // 0~N-1
pick := len(arr) + 1 // 1 ~ N
dp := make([][]int, size)
for i := 0; i < size; i++ {
dp[i] = make([]int, pick)
}
// get 不从0开始,因为拿0个无意义
for get := 1; get < pick; get++ { // 1 ~ N
maxIndex := size - get
// i~N-1
for i := size - get; i >= 0; i-- {
if arr[i] >= arr[maxIndex] {
maxIndex = i
}
dp[i][get] = maxIndex
}
}
return dp
} func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
func getMin(a int, b int) int {
if a < b {
return a
} else {
return b
}
} type FddSa struct {
Sa []int
Rank []int
} func NewFddSa(bytes []byte) *FddSa {
ret := &FddSa{}
ret.Rank = make([]int, len(bytes))
ret.Sa = make([]int, len(bytes))
index := suffixarray.New(bytes)
p1 := uintptr(unsafe.Pointer(index)) //获取指针
p1 += 24
p2 := *(*[]int32)(unsafe.Pointer(p1)) //将指针转行成切片
for i := 0; i < len(bytes); i++ {
ret.Sa[i] = int(p2[i]) //sa数组
ret.Rank[int(p2[i])] = i //rank数组
}
return ret
}

执行结果如下:


左神java代码

力扣321. 拼接最大数

评论

2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K。 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑。返回所有可能的结果中,代表最大数字的结果。的更多相关文章

  1. 在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行

    package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...

  2. 按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    int[]x=new int [50]; char[][]y=new char[10][10]; int j=1,w=0; for(int i=0;i<50;i++) { x[i]=j; j+= ...

  3. 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    package liu0915; import java.util.Random; public class Test0915sz { public static void main(String[] ...

  4. 16.按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    //分类 package com.bao; public class Shuchu { int[]yi=new int[50]; String[][]er=new String[10][10]; vo ...

  5. 给定一个递增序列,a1 <a2 <...<an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤i<n),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小是多少?

    // ConsoleApplication5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<vector> ...

  6. [程序员代码面试指南]第9章-在两个长度相等的排序数组中找到第k小的数(二分)

    题目 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第k小的数. 题解 利用题目"在两个长度相等的排序数组中找到第上中位数"的函数 分类讨论 k < 1 ...

  7. 【C语言】整型在内存中的存储

    整型在内存中的存储 1.整型的归类 char short int long 以上都分为有符号(signed)与无符号(unsigned)的类型 2.原码.反码和补码 2.1 定义 计算机在表示一个数字 ...

  8. 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...

  9. 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

    题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...

  10. 写出将字符串中的数字转换为整型的方法,如:“as31d2v”->312,并写出相应的单元测试,正则去掉非数值、小数点及正负号外的字符串

    写出将字符串中的数字转换为整型的方法,如:"as31d2v"->312,并写出相应的单元测试,输入超过int范围时提示不合法输入. public struct Convert ...

随机推荐

  1. 使用ActiveMQ中遇到的端口占用问题

    原Linux虚拟机中安装了ActiveMQ,EMQX.后期使用中主要使用EMQX来实现消息服务,停止了ActiveMQ.但是虚拟机挂起之后,长时间未再使用.近期由于有使用ActiveMQ的需要,而临时 ...

  2. python selenium 操作文件上传,并发操作时,文件选择窗口混乱解决方案

    上传文件 使用的是 python + autoit 模块,这种方式有一个问题,当出现多条任务同时选择文件上传的时候,无法判断那个文件选择窗口的归属,从而出现上传了错误的文件! 解决方法: 要上载文件而 ...

  3. Python基础教程:赋值的多个方式

    一.序列解包/可迭代对象解包 释义:将一个序列(或任何可迭代的对象)解包,并将得到的值存储到一系列变量中. 1.并行赋值 >>> x,y,z = 1,2,3 >>> ...

  4. Android studio的基本使用--基础篇

    一.新建项目 其实跟IDEA新建项目的流程基本一致,File->New->New project,这样就能够新建出来一个项目啦! 一般情况下,我们都会选择Empty Activity,之后 ...

  5. 对Android关联SDK后,还是无法显示那俩图标的解决

    显示出来!!!! 可以这么解决: 步骤一: 步骤二: 找到这个,在上方的栏里面: 步骤三: 将这四个选中: 步骤四: 然后选中这个栏: 步骤五: 选中Android: 步骤六: 最后,点击右下角的Ap ...

  6. Linux & 标准C语言学习 <DAY10>

    一.函数递归     函数自己调用自己的行为,叫做函数递归     递归是分治思想的一种具体实现,就是把一个复杂而庞大的问题,分解成若干个相似的小问题,解决所有小问题以解决大问题     如果函数递归 ...

  7. Android 音视频 - EGL 源码解析以及 C++ 实现

    OpenGL 是一个跨平台的 API,而不同的操作系统(Windows,Android,IOS)各有自己的屏幕渲染实现.所以 OpenGL 定义了一个中间接口层 EGL(Embedded Graphi ...

  8. 2023GDKOI总结

    2023GDKOI总结 说明:不是GD选手,只是因为来zsjz集训就顺便参加了GDKOI,不过也不参与GD选手排名. 考前看了看GDKOI2021的题,当时是考了3天,每天4题,而里面只有一道题是我一 ...

  9. 多线程基础之CAS、AQS、ABA辨析

    这三个单词算是多线程面试常见的问题了,也是很多小白不太懂的问题,这里给出我的理解来. 一.CAS J.U.C 并发包中的很多类都涉及到了 CAS,可以说没有 CAS 和 volatile 就没有 J. ...

  10. 【深入浅出 Yarn 架构与实现】5-3 Yarn 调度器资源抢占模型

    本篇将对 Yarn 调度器中的资源抢占方式进行探究.分析当集群资源不足时,占用量资源少的队列,是如何从其他队列中抢夺资源的.我们将深入源码,一步步分析抢夺资源的具体逻辑. 一.简介 在资源调度器中,以 ...