Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(

2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(

作者头像
福大大架构师每日一题
发布于 2023-12-13 03:32:14
发布于 2023-12-13 03:32:14
16700
代码可运行
举报
运行总次数:0
代码可运行

2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2,

返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。

每一步「操作」中,你可以分别从 arr1 和 arr2 中各选出一个索引,

分别为 i 和 j,0 <= i < arr1.length 和 0 <= j < arr2.length,

然后进行赋值运算 arr1[i] = arr2[j]。如果无法让 arr1 严格递增,请返回 -1。

输入:arr1 = [1,5,3,6,7], arr2 = [4,3,1]。

输出:2。

答案2023-12-09:

灵捷3.5

大体过程如下:

算法1(makeArrayIncreasing1):

1.对arr2进行排序并去除重复元素,生成新的数组help,并统计cnt为help的长度。

2.通过递归函数process1来计算从arr1的索引i开始到结尾的最小操作数。初始时,i为-1。

3.在process1中,通过二分查找函数find,在arr2中找到第一个大于cur的元素的索引f。

4.使用循环遍历arr1中从i+1到末尾的元素。

  • • 若当前元素大于cur,则说明可以选择该元素,继续递归调用process1,并将操作数times加1。
  • • 若f不等于-1且小于arr2的长度,更新cur为arr2[f],同时f加1,times加1。
  • • 若f等于-1或大于等于arr2的长度,跳出循环。

5.返回递归调用的结果ans,即最小操作数。

算法2(makeArrayIncreasing2):

1.对arr2进行排序并去除重复元素,生成新的数组help,并统计cnt为help的长度。

2.创建dp数组,初始值为-1。

3.通过递归函数process2来计算从arr1的索引i开始到结尾的最小操作数。同时,使用dp数组记录已计算过的结果,以便后续查询。

4.在process2中,若dp[i+1]不等于-1,直接返回dp[i+1]。

5.剩下的过程与makeArrayIncreasing1基本相同,只是将递归调用替换为对dp数组的查询和更新。

6.返回递归调用的结果ans,同时将其保存到dp[i+1]中。

算法3(makeArrayIncreasing3):

1.对arr2进行排序并去除重复元素,生成新的数组arr2,并统计m为arr2的长度。

2.创建dp数组,长度为n+2,并初始化为最大整数。

3.从arr1末尾向前遍历,使用循环计算从索引i开始到结尾的最小操作数。

  • • 初始化cur为arr1[i],f为在arr2中找到第一个大于cur的元素的索引。
  • • 初始化dp[i+1]为最大整数,times为0。
  • • 使用循环遍历arr1中从i+1到末尾的元素,操作步骤与makeArrayIncreasing1和makeArrayIncreasing2相似。
  • • 若dp[j+1]不等于最大整数,更新dp[i+1]为times+dp[j+1]与dp[i+1]中的较小值。
  • • 若f不等于-1且小于m,更新cur为arr2[f],同时f加1,times加1。
  • • 若f等于-1或大于等于m,跳出循环。

4.若dp[0]等于最大整数,返回-1;否则返回dp[0]作为最小操作数。

时间复杂度分析:

  • • 算法1和算法2的时间复杂度为O(n * m),其中n和m分别为arr1和arr2的长度,因为每个元素都需要遍历一次。
  • • 算法3的时间复杂度为O(n * m + m * log(m)),其中m为arr2的长度,因为要对arr2进行排序并进行二分查找。

额外空间复杂度分析:

  • • 算法1和算法2的额外空间复杂度为O(m),用于存储去重后的arr2。
  • • 算法3的额外空间复杂度为O(m),用于存储去重后的arr2,并且使用了一个大小为n+2的dp数组来记录中间结果。

go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "math"
    "sort"
)

func makeArrayIncreasing1(arr1 []int, arr2 []int) int {
    sort.Ints(arr2)
    cnt := 1
    for i := 1; i < len(arr2); i++ {
        if arr2[i] != arr2[i-1] {
            cnt++
        }
    }
    help := make([]int, cnt)
    help[0] = arr2[0]
    for i, j := 1, 1; i < len(arr2); i++ {
        if arr2[i] != arr2[i-1] {
            help[j] = arr2[i]
            j++
        }
    }
    ans := process1(arr1, help, -1)
    if ans == math.MaxInt64 {
        return -1
    }
    return ans
}

func process1(arr1 []int, arr2 []int, i int) int {
    if i == len(arr1) {
        return 0
    } else {
        cur := 0
        if i == -1 {
            cur = math.MinInt64
        } else {
            cur = arr1[i]
        }
        f := find(arr2, cur)
        ans := math.MaxInt64
        times := 0
        for j := i + 1; j <= len(arr1); j++ {
            if j == len(arr1) || cur < arr1[j] {
                next := process1(arr1, arr2, j)
                if next != math.MaxInt64 {
                    ans = min(ans, times+next)
                }
            }
            if f != -1 && f < len(arr2) {
                cur = arr2[f]
                f++
                times++
            } else {
                break
            }
        }
        return ans
    }
}

func find(arr2 []int, num int) int {
    l := 0
    r := len(arr2) - 1
    ans := -1
    for l <= r {
        m := (l + r) / 2
        if arr2[m] > num {
            ans = m
            r = m - 1
        } else {
            l = m + 1
        }
    }
    return ans
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func makeArrayIncreasing2(arr1 []int, arr2 []int) int {
    sort.Ints(arr2)
    cnt := 1
    for i := 1; i < len(arr2); i++ {
        if arr2[i] != arr2[i-1] {
            cnt++
        }
    }
    help := make([]int, cnt)
    help[0] = arr2[0]
    for i, j := 1, 1; i < len(arr2); i++ {
        if arr2[i] != arr2[i-1] {
            help[j] = arr2[i]
            j++
        }
    }
    dp := make([]int, len(arr1)+1)
    for i := range dp {
        dp[i] = -1
    }
    ans := process2(arr1, help, -1, dp)
    if ans == math.MaxInt64 {
        return -1
    }
    return ans
}

func process2(arr1 []int, arr2 []int, i int, dp []int) int {
    if i == len(arr1) {
        return 0
    } else {
        if dp[i+1] != -1 {
            return dp[i+1]
        }
        cur := 0
        if i == -1 {
            cur = math.MinInt64
        } else {
            cur = arr1[i]
        }
        f := find(arr2, cur)
        ans := math.MaxInt64
        times := 0
        for j := i + 1; j <= len(arr1); j++ {
            if j == len(arr1) || cur < arr1[j] {
                next := process2(arr1, arr2, j, dp)
                if next != math.MaxInt64 {
                    ans = min(ans, times+next)
                }
            }
            if f != -1 && f < len(arr2) {
                cur = arr2[f]
                f++
                times++
            } else {
                break
            }
        }
        dp[i+1] = ans
        return ans
    }
}

func makeArrayIncreasing3(arr1 []int, arr2 []int) int {
    sort.Ints(arr2)
    m := 1
    for i := 1; i < len(arr2); i++ {
        if arr2[i] != arr2[m-1] {
            arr2[m] = arr2[i]
            m++
        }
    }
    n := len(arr1)
    dp := make([]int, n+2)
    for i := n - 1; i >= -1; i-- {
        cur := 0
        if i == -1 {
            cur = math.MinInt64
        } else {
            cur = arr1[i]
        }
        f := find3(arr2, m, cur)
        dp[i+1] = math.MaxInt64
        times := 0
        for j := i + 1; j <= n; j++ {
            if j == n || cur < arr1[j] {
                if dp[j+1] != math.MaxInt64 {
                    dp[i+1] = min(dp[i+1], times+dp[j+1])
                }
            }
            if f != -1 && f < m {
                cur = arr2[f]
                f++
                times++
            } else {
                break
            }
        }
    }
    if dp[0] == int(^uint(0)>>1) {
        return -1
    }
    return dp[0]
}

func find3(arr2 []int, size int, num int) int {
    l := 0
    r := size - 1
    ans := -1
    for l <= r {
        m := (l + r) / 2
        if arr2[m] > num {
            ans = m
            r = m - 1
        } else {
            l = m + 1
        }
    }
    return ans
}

func main() {
    if true {
        arr1 := []int{1, 5, 3, 6, 7}
        arr2 := []int{4, 3, 1}
        fmt.Println(makeArrayIncreasing1(arr1, arr2))
    }
    if true {
        arr1 := []int{1, 5, 3, 6, 7}
        arr2 := []int{4, 3, 1}
        fmt.Println(makeArrayIncreasing2(arr1, arr2))
    }
    if true {
        arr1 := []int{1, 5, 3, 6, 7}
        arr2 := []int{4, 3, 1}
        fmt.Println(makeArrayIncreasing3(arr1, arr2))
    }
}

在这里插入图片描述

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
samba服务器配置
Samba最大的功能就是可以用于Linux与windows系统直接的文件共享和打印共享,Samba既可以用于windows与Linux之间的文件共享,也可以用于Linux与Linux之间的资源共享,由于NFS(网络文件系统)可以很好的完成Linux与Linux之间的数据共享,因而 Samba较多的用在了Linux与windows之间的数据共享上面。
筱竼
2022/08/18
4.3K0
Samba共享服务_NFS共享存储
红帽官方samba讲解 Samba 是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。
全栈程序员站长
2022/11/08
4.2K0
Samba共享服务_NFS共享存储
samba的使用
下面关于配置文件的详解内容来自:http://yuanbin.blog.51cto.com/363003/115761。
战神伽罗
2019/07/24
2.5K1
玩转企业常见应用与服务系列(五):网络文件共享服务 Samba 原理与实践
Samba 是一个能让 Linux 系统应用 Microsoft 网络通讯协议的软件,而 SMB 是 Server Message Block 的缩写,即为服务器消息块,SMB 主要是作为Microsoft 的网络通讯协议,后来 Samba 将 SMB 通信协议应用到了 Linux 系统上,就形成了现在的 Samba 软件。后来微软又把 SMB 改名为 CIFS(Common Internet File System),即公共 Internet 文件系统,并且加入了许多新的功能,这样一来,使得Samba具有了更强大的功能。
民工哥
2023/11/20
2.5K0
玩转企业常见应用与服务系列(五):网络文件共享服务 Samba 原理与实践
samba文件共享服务器安装
安装好samba软件包以后,在系统中会添加名为smb和nmb的标准系统服务,管理员可以通过service(centos6)或systemctl(centos7)工具来控制Samba服务的启动与终止。
全栈程序员站长
2022/08/30
2.7K0
Samba服务器搭建
1. 安装Samba及相关包 $ sudo apt-getinstall samba samba-common smbfsPython-glade2system-config-samba 2. 创建共享目录 $ mkdir /home/kevin/share $ sudo chmod 777/home/kevin/Share 3. 创建Samba配置文件 1) 保存现有配置文件 $ sudo cp/etc/samba/smb.conf /etc/samba/smb.conf.backup 2) 修改配置文件 $ sudo gedit/etc/samba/smb.conf 在文件末尾添加 [share] path = /home/kevin/Share available = yes browseable = yes public = yes writable = yes
星哥玩云
2022/07/01
1.5K0
Samba网络文件共享服务介绍
Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件。后来微软又把 SMB 改名为 CIFS(Common Internet File System),即公共 Internet 文件系统,并且加入了许多新的功能,这样一来,使得Samba具有了更强大的功能。
保持热爱奔赴山海
2019/09/18
2.9K0
Samba网络文件共享服务介绍
Linux——搭建Samba(CIFS)服务器
Samba服务:是提供基于Linux和Windows的共享文件服务,服务端和客户端都可以是Linux或Windows操作系统。可以基于特定的用户访问,功能比NFS更强大。
用户4268038
2021/11/18
7.5K0
CentOS-Samba服务安装与配置
安装samba服务端软件 [root@localhost var]# yum install samba samba-client 修改samba配置文件 samba文件共享默认配置文件存放在 /etc/samba/smb.conf 下,用于配置Samba服务内容 [root@localhost var]# vim /etc/samba/smb.conf #======================= Global Settings ==============================
偏有宸机
2020/11/04
6610
Samba服务的配置总结
之前介绍了Linux下Samba服务器部署,这里简单总结下Samba服务参数的配置说明: Samba服务的主配置文件是smb.conf,默认在/etc/samba/目录下。smb.conf含有多个段,每个段由段名开始,直到下个段名。每个段名放在方括号中间。每段的参数的格式是:名称=指。配置文件中一行一个段名和参数,段名和参数名不分大小写。除了[global]段外,所有的段都可以看作是一个共享资源。段名是该共享资源的名字,段里的参数是该共享资源的属性。Samba安装好后,使用testparm命令可以测试smb
洗尽了浮华
2018/04/08
3.7K0
Samba服务的配置总结
linux文件共享 samba_文件共享服务
Samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件 , 由服务器及客户端程序构成 ; SMB (Server Messages Block , 信息服务块) 是一种在局域网上共享文件和打印机的一种通信协议 , 它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务 ; SMB 协议是 客户机/服务器 型协议 , 客户机通过该协议可以访问服务器上的共享文件系统 , 打印机及其他资源 ; 通过设置 NetBIOS over TCP/IP 使得 Samba 不但能与局域网络主机分享资源 , 还能与全世界的电脑分享资源 ;
全栈程序员站长
2022/11/09
4.2K0
第四章 Samba服务
上一章我们讲了NFS,可实现Linux间的文件共享,我们知道windows之间也有共享的功能,但是不同操作系统之间的共享,如:Linux与windows之间互访共享资源就需要samba服务来实现了。
晓天
2019/07/04
3K0
第四章  Samba服务
linux安装samba服务器_开启samba服务
我们都知道windows上面有一个很方便的文件共享的功能,samba服务主要就是实现了linux平台上的文件共享功能,使得linux平台也能够和windows进行文件共享,但是使用linux搭建的文件共享服务器对于windows来说和平常windows和windows之间进行文件共享没有什么区别。
全栈程序员站长
2022/10/02
10.2K0
linux安装samba服务器_开启samba服务
Samba:使用 Samba 为远程客户端提供共享文件系统
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/09/21
4.5K0
Samba:使用 Samba 为远程客户端提供共享文件系统
003.SMB相关文件
注意: 安全界别:share:不需要密码可以访问 #在samba4中share已弃用,改为user
木二
2019/07/26
5340
一文简述什么是Samba服务
今天来简单聊一聊SAMBA服务,SAMBA服务主要用于实现windows和Linux下的文件共享、打印共享等。
reload
2024/07/26
2.6K0
一文简述什么是Samba服务
Samba文件共享服务的实现
试验环境:两台主机 服务端:192.168.56.11 客户端:192.168.56.12
星哥玩云
2022/07/14
6150
Linux之samba服务的简单运用
在Windows中借助netbios(广播方式,主要功能是主机名解析),cifs(common internet file system),smb(service message block)来实现文件共享。
星哥玩云
2022/07/04
2.5K0
Linux Samba服务器搭建
SMB协议(Server Message Block),之后扩展成CIFS(Common Internet Filesystem)。
全栈程序员站长
2022/07/04
5.1K0
samba共享服务安装,开发可用映射
1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991年,当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作。当时,Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB是没有意义的字符而拒绝了申请。后来Tridgwell不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的名字由此诞生(见图所示)。Samba服务程序现在已经成为在Linux系统与Windows系统之间共享文件的最佳选择。
菲宇
2019/06/11
1.2K0
samba共享服务安装,开发可用映射
相关推荐
samba服务器配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验