2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1,当arr[cur]>arr[cur-1]时,out[cur]>out[cur-1];当arr[cur]>arr
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1,当arr[cur]>arr[cur-1]时,out[cur]>out[cur-1];当arr[cur]>arr[cur+1]时,out[cur]>out[cur+1]。求最小out的元素之和。比如[2,3,5,5,4],生成数组是[1,2,3,2,1],和是9。
福大大 答案2021-06-18:
1.从左往右遍历,生成left数组。当arr[cur]>arr[cur-1]时,left[cur]=left[cur-1]+1。其他情况,left[cur]=1。[2,3,5,5,4]的left数组是[1,2,3,1,1]。
2.从右往左遍历,生成right数组。当arr[cur]>arr[cur+1]时,right[cur]=right[cur+1]+1。其他情况,right[cur]=1。[2,3,5,5,4]的right数组是[1,1,1,2,1]。
3.生成数组out,out数组的i位置元素是left数组i位置元素和right数组i位置元素的最大值。[2,3,5,5,4]的out数组是[1,2,3,2,1]。
4.求数组out的累加和,这个累加和就是需要的返回值。
5.时间复杂度O(N)。空间复杂度O(N)。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
arr := []int{2, 3, 5, 5, 4}
ret := candy1(arr)
fmt.Println(ret)
}
// 这是原问题的优良解
// 时间复杂度O(N),额外空间复杂度O(N)
func candy1(arr []int) int {
if len(arr) == 0 {
return 0
}
N := len(arr)
left := make([]int, N)
for i := 1; i < N; i++ {
if arr[i-1] < arr[i] {
left[i] = left[i-1] + 1
}
}
right := make([]int, N)
for i := N - 2; i >= 0; i-- {
if arr[i] > arr[i+1] {
right[i] = right[i+1] + 1
}
}
ans := 0
for i := 0; i < N; i++ {
ans += getMax(left[i], right[i])
}
return ans + N
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1,当arr[cur]>arr[cur-1]时,out[cur]>out[cur-1];当arr[cur]>arr的更多相关文章
- 页面上有3个输入框:分别为max,min,num;三个按钮:分别为生成,排序,去重;在输入框输入三个数字后,先点击生成按钮,生成一个数组长度为num,值为max到min之间的随机整数点击排序,对当前数组进行排序,点击去重,对当前数组进行去重。 每次点击之后使结果显示在控制台
<!DOCTYPE html> <html> <head> <!-- 页面上有3个输入框:分别为max,min,num:三个按钮:分别为生成,排序,去重: 在 ...
- 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝
第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...
- 18 已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果
面试题18:破解RANDOM随机数案例 已知下面的字符串是通过RANDOM随机数变量md5sum后,再截取一部分连续字符串的结果,请破解这些字符串对应的使用md5sum处理前的RANDOM对应的数字? ...
- 【es6】将2个数组合并为一个数组
//第一种 一个数组中的值为key 一个数组中的值为value let arr1 = ['内存','颜色','尺寸']; let arr2 = [1,2,3]; let temp = arr1.map ...
- [转]php判断一个数组是另一个数组的子集
FROM : http://blog.csdn.net/lcion/article/details/8985220 今天完成一个算法的过程中,有几个需求模块,其中就有判断$a数组是否是$b数组的子集, ...
- js数组合并(一个数组添加到另一个数组里面)方法
js定义两个数组. var arrA=[1,2,3]; var arrB=[4,5,6]; 要实现[1,2,3,4,5,6],如果直接arrA.push(arrB); 则arrB只会作为了arrA的一 ...
- php判断一个数组是另一个数组的子集
需求最少的时间复杂度判断$a数组是否是$b数组的子集 // 快速的判断$a数组是否是$b数组的子集$a = array(135,138);$b = array(135,138,137); 实现方法 这 ...
- 2021.06.18 思科anyconnect安全移动客户端通知
mac系统更新后,开关机后都会弹出思科anyconnect安全移动客户端通知的弹框,很烦,所以要干掉它! 打开终端,执行以下两行命令即可: cd /Library/LaunchAgents/ mv / ...
- js随机生成一个数组中的随机字符串以及更新验证码
随机生成m,n范围的值得公式: Math.random()*(n-m)+m: 改正公式:Math.random()*(n+1-m)+m // 生成随机字符串function randomMixed(n ...
- 写一个函数,参数为$n,生成一个数组,其元素为1~$n,各元素位置随机排列,不得重复
function rand_array($n){ $array=range(1,$n); shuffle($array); return $array; }
随机推荐
- Java Swing的练习感悟
感悟心得 这还是我第一次使用Java Swing写代码呢,直接就是趣味性拉满! 在相关的界面代码的基础上,在必要的位置嵌入Java代码,就可以很好的实现啦! 简单的嘞! (有兴趣的各位可以选择去浅浅地 ...
- wx.BoxSizer布局管理器用法,及其Add()方法参数说明
wx.BoxSizer 布局管理器是一种常见的布局管理器,它可以在水平或垂直方向上布置子窗口部件.同时,它还可以在水平或垂直方向上包含其他 wx.BoxSizer 来创建复杂的布局. 下面是 wx.B ...
- 第二章 数据和C
2.1错误和警告 如果输入这个程序的过程中出现错误(error),比如少了一个分号,编译器会给出语法错误消息.即使输入正确,编译器还可能发出这样的警告(warning):"警告------从 ...
- Why WebRTC丨“浅入深出”的工作原理详解
前言 近几年实时音视频通信应用呈现出了大爆发的趋势.在这些实时通信技术的背后,有一项不得不提的技术--WebRTC. 今年 1 月,WebRTC 被 W3C 和 IETF 发布为正式标准.据调研机构 ...
- Agora 教程丨如何实现15mins自主搭建一个教育平台?
[ 前言 ] 2020 年对于全球而言都是非常特殊的一年,人与人之间的"物理连结"受到了严重影响,日常的生活.工作大都也逐渐向线上转移.受此影响,大量的线下业务也加速了线上转型,这 ...
- 【ACM算法竞赛日常训练】DAY5题解与分析【储物点的距离】【糖糖别胡说,我真的不是签到题目】| 前缀和 | 思维
DAY5共2题: 储物点的距离(前缀和) 糖糖别胡说,我真的不是签到题目(multiset,思维) 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法 ...
- 网络计划技术——关键路线法(Python)
关键路径法是基于进度网络模型的方法,用网络图表示各项活动之间的相互关系,获得在一定工期.成本.资源约束条件下的最优进度安排.关键路径法源于美国杜邦公司对于项目管理控制成本.减少工期的研究.1959年, ...
- Redis集群介绍及测试思路
作者:京东零售 李磊 Redis集群介绍 Redis集群一般有四种方式,分别为:主从复制.哨兵模式.Cluster以及各大厂的集群方案.在3.0版本之前只支持单实例模式,3.0之后支持了集群方式.在3 ...
- SQL Case条件判断语句
问题描述:在表中取到一些值做出判断,配合监控监测一些表中的数据.使用select case when if 来做条件查询判断 CASE 表达式遍历条件并在满足第一个条件时返回一个值(类似于 if-th ...
- 从零开始学Vue(二~三)—— Vue 实例 / 模板语法(插值、指令)
概述 vue.js作为现在笔记热门的JS框架,使用比较简单易上手,也成为很多公司首选的JS框架. 但是对于初学者可能学起来有些麻烦,所以推出<从零开始学Vue>系列博客,本系列计划推出19 ...