2021-08-11:按要求补齐数组。给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。

福大大 答案2021-08-11:

用尽可能大的数字扩充range范围。尽可能大的数字是range+1。
时间复杂度:O(数组长度+log(n))。
空间复杂度:O(1)。

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

package main

import (
"fmt"
"math"
"sort"
) func main() {
arr := []int{1, 2, 31, 33} if true {
ret := minPatches(arr, 555)
fmt.Println(ret)
} if true {
ret := minPatches2(arr, 555)
fmt.Println(ret)
}
} // arr请保证有序,且正数 1~aim
func minPatches(arr []int, aim int) int {
patches := 0 // 缺多少个数字
range2 := 0 // 已经完成了1 ~ range的目标
sort.Slice(arr, func(i, j int) bool {
return arr[i] < arr[j]
})
for i := 0; i != len(arr); i++ {
// arr[i]
// 要求:1 ~ arr[i]-1 范围被搞定!
for arr[i]-1 > range2 { // arr[i] 1 ~ arr[i]-1
range2 += range2 + 1 // range + 1 是缺的数字
patches++
if range2 >= aim {
return patches
}
}
// 要求被满足了!
range2 += arr[i]
if range2 >= aim {
return patches
}
}
for aim >= range2+1 {
range2 += range2 + 1
patches++
}
return patches
} // 嘚瑟
func minPatches2(arr []int, K int) int {
patches := 0 // 缺多少个数字
range2 := 0 // 已经完成了1 ~ range的目标
for i := 0; i != len(arr); i++ {
// 1~range
// 1 ~ arr[i]-1
for arr[i] > range2+1 { // arr[i] 1 ~ arr[i]-1 if range2 > math.MaxInt64-range2-1 {
return patches + 1
} range2 += range2 + 1 // range + 1 是缺的数字
patches++
if range2 >= K {
return patches
}
}
if range2 > math.MaxInt64-arr[i] {
return patches
}
range2 += arr[i]
if range2 >= K {
return patches
}
}
for K >= range2+1 {
if K == range2 && K == math.MaxInt64 {
return patches
}
if range2 > math.MaxInt64-range2-1 {
return patches + 1
}
range2 += range2 + 1
patches++
}
return patches
}

执行结果如下:


左神java代码

2021-08-11:按要求补齐数组。给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用的更多相关文章

  1. 9.11排序与查找(一)——给定两个排序后的数组A和B,当中A的末端有足够的缓冲空间容纳B。将B合并入A并排序

    /**  * 功能:给定两个排序后的数组A和B,当中A的末端有足够的缓冲空间容纳B.将B合并入A并排序. */ /** * 问题:假设将元素插入数组A的前端,就必须将原有的元素向后移动,以腾出空间. ...

  2. 18 11 05 继续补齐对python中的class不熟悉的地方 和 pygame 精灵

    ---恢复内容开始--- class game : #历史最高分----- 是定义类的属性 top_score =0 def __init__(self, player_name) : #是定义的实例 ...

  3. Leetcode 330.按要求补齐数组

    按要求补齐数组 给定一个已排序的正整数数组 nums,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数 ...

  4. Java实现 LeetCode 330 按要求补齐数组

    330. 按要求补齐数组 给定一个已排序的正整数数组 nums,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums ...

  5. [Swift]LeetCode330. 按要求补齐数组 | Patching Array

    Given a sorted positive integer array nums and an integer n, add/patch elements to the array such th ...

  6. 007-TreeMap、Map和Bean互转、BeanUtils.copyProperties(A,B)拷贝、URL编码解码、字符串补齐,随机字母数字串

    一.转换 1.1.TreeMap 有序Map 无序有序转换 使用默认构造方法: public TreeMap(Map<? extends K, ? extends V> m) 1.2.Ma ...

  7. 为kubectl配置别名和命令行补齐

    配置别名 # vim ~/.bashrc 添加 alias k='kubectl' # source ~/.bashrc 配置命令行补齐 # yum install -y bash-completio ...

  8. PHP开发小技巧②—实现二维数组根据key进行排序

    在PHP中内置了很多对数组进行处理的函数,有很多时候我们直接使用其内置函数就能达到我们的需求,得到我们所想要的结果:但是,有的时候我们却不能通过使用内置函数实现我们的要求,这就需要我们自己去编写算法来 ...

  9. LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)

    题目:合并已排序数组 难度:Easy 题目内容: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as ...

  10. Java一维与二维数组的拷贝与排序

    Java一维与二维数组的拷贝与排序 目录 Java一维与二维数组的拷贝与排序 Arrays.sort() 一维数组升序排序 二维数组按行升序排序 二维数组按列升序排序 Java中的数组 Java中数组 ...

随机推荐

  1. Python中的startswith()函数用法

    函数:startswith() 作用:判断字符串是否以指定字符或子字符串开头 一.函数说明语法:string.startswith(str, beg=0,end=len(string))        ...

  2. HTTPS、HTTP/2前端入门篇

    随着网络安全重要性日益凸显,越来越多的站点已经全站切换到HTTPS,其中很多HTTPS站点同时将HTTP协议升级到了HTTP/2.作为一只前端,最近一直在学习和应用相关知识点,便总结梳理如下. 一.何 ...

  3. MFC 错误调试总结

    1.  msdia80.dll can not be loaded 该文件的路径应该是:C:\Program Files\Common Files\microsoft shared\VC\msdia8 ...

  4. CSS 平滑滚动 scroll-behavior: smooth

    凡是需要滚动的地方都加一句scroll-behavior:smooth 来提升滚动体验! 经常使用的锚点定位功能就有了平滑定位功能,如<a href="#">返回顶部& ...

  5. MySQL基础随笔记

    [1]SQL语言入门      我们都知道,数据库管理人员(DBA)通过数据库管理系统(DBMS)可以对数据库(DB)中的数据进行操作,但具体是如何操作的呢?这就涉及到我们本节要讲的SQL语言.SQL ...

  6. NotionAI - 文档领域的ChatGPT,一款 AI 加持的在线文档编辑和管理工具

    简介 NotionAI - 文档领域的ChatGPT,一款 AI 加持的在线文档编辑和管理工具 作为国际领先的在线文档编辑和管理工具,Notion受到了广大用户的欢迎,尤其是程序员们.它不仅支持笔记. ...

  7. 项目优化-CDN缓存

    名次解释 CDN(Content Delivery Network)内容分发网络. CDN出现背景: 客户端从源站点获取数据,当服务端访问流量较为拥挤的时候 可能出现缓慢卡顿的现象,为了解决这个问题, ...

  8. 必知必会的 WebSocket 协议

    文章介绍 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它的出现使客户端和服务器之间的数据交换变得更加简单.WebSocket 通常被应用在实时性要求较高的场景,例如赛事数据. ...

  9. 最新版 Harbor 在ubuntu系统上安装

    最新版 Harbor 在ubuntu系统上安装 The latest version of Harbor is installed on the ubuntu system 安装docker Inst ...

  10. 四月二十日java基础知识

    1.不可被继承的成员与最终类:在默认情况下,所有的成员变量和成员方法都可以被覆盖,如果父类的成员不希望被子类的成员锁覆盖可以将它们声明为final.如果用final来修饰成员变量,则说明该成员变量是最 ...