引言

​ 今天的每日一题原题是2278. 字母在字符串中的百分比,直接模拟,逐个匹配,统计letter在原始字符串s中出现的次数,然后再计算所占百分比即可。更换成前几天遇到的更有意思的一题来写这个每日一题。

题目

2012. 数组美丽值求和

给你一个下标从 0 开始的整数数组 nums 。对于每个下标 i1 <= i <= nums.length - 2),nums[i]美丽值 等于:

  • 2,对于所有 0 <= j < ii < k <= nums.length - 1 ,满足 nums[j] < nums[i] < nums[k]
  • 1,如果满足 nums[i - 1] < nums[i] < nums[i + 1] ,且不满足前面的条件
  • 0,如果上述条件全部不满足

返回符合 1 <= i <= nums.length - 2 的所有 nums[i]美丽值的总和

示例 1:

输入:nums = [1,2,3]
输出:2
解释:对于每个符合范围 1 <= i <= 1 的下标 i :
- nums[1] 的美丽值等于 2

示例 2:

输入:nums = [2,4,6,4]
输出:1
解释:对于每个符合范围 1 <= i <= 2 的下标 i :
- nums[1] 的美丽值等于 1
- nums[2] 的美丽值等于 0

示例 3:

输入:nums = [3,2,1]
输出:0
解释:对于每个符合范围 1 <= i <= 1 的下标 i :
- nums[1] 的美丽值等于 0

提示:

  • 3 <= nums.length <= 105
  • 1 <= nums[i] <= 105

思路

​ 首先还是读懂题目,对于符合1 <= i <= nums.length - 2的下标i,美丽值可能有3种情况:

  • 美丽值 = 2,对于在i位置前面的数,都严格小于nums[i];且在i位置后面的数,都严格大于nums[i]
  • 美丽值 = 1,无法满足第1种情况下,且可以满足nums[i]前面的1个数严格小于它,后面的1个数严格大于它
  • 美丽值 = 0,排除上述2种情况的其他情况

​ 那么对于每个在范围内的i,我们要逐个判断美丽值:对于情况1,如果每个都去比较,判断单个i需要的时间复杂度是O(n),整体的时间复杂度就是O(n^2);对于情况2,只要判断前后,判断单个i的时间复杂度是O(1);对于情况3,在上述2种情况都判断后,不再需要单独判断。

​ 由此可见,我们主要优化点在于如何快速判断情况1。构造2个辅助数组,prefixMax[]suffixMin[]prefixMax[i]表示下标[0, i]范围内的最大值,suffixMin[i]表示下标[i, n-1]范围内的最小值。有了这2个辅助数组后,对于位置i我们在判断是否满足情况1的时间,只要判断条件 prefixMax[i-1] < nums[i] && nums[i] < suffixMin[i+1] 即可,这样每次判断的时间复杂度会缩减到O(1),判断范围内的i的时间复杂度是O(n)。而构建这2个辅助数组,需要分别从前往后和从后往前遍历原始数组,时间复杂度也是O(n)。这样,我们就避免了O(n^2)的时间复杂度。

​ 进一步来看,如果我们从前往后处理i的话,prefixMax[]数组不需要被创建,只要滚动维护一个prefixMax的变量,表示[0, i]范围内的最大值即可,这样,可以省下一个大小为n的数组的空间开销。同理,如果从后往前处理i的话,可以省下suffixMin[]的空间。不过,这2者不可兼得。

图解

代码

class Solution {
public int sumOfBeauties(int[] nums) {
int[] min = getMin(nums);
int sum = 0;
int max = nums[0];
for (int i = 1; i < nums.length - 1; i++) {
if (nums[i] > max && nums[i] < min[i + 1]) {
sum += 2;
} else if (nums[i] > nums[i - 1] && nums[i] < nums[i + 1]) {
sum += 1;
}
// 求出遍历到下一个i时,nums[0,i-1]的最大值
max = Integer.max(max, nums[i]);
}
return sum;
} /**
* 从后往前,求出当前下标到数组结尾的最小值
*/
private int[] getMin(int[] nums) {
int n = nums.length;
int[] min = new int[n];
min[n - 1] = nums[n - 1];
for (int i = n - 2; i >= 0; i-- ) {
min[i] = Integer.min(min[i+1], nums[i]);
}
return min;
}
}

耗时

leetcode每日一题:数组美丽值求和的更多相关文章

  1. 【js】Leetcode每日一题-数组异或操作

    [js]Leetcode每日一题-数组异或操作 [题目描述] 给你两个整数,n 和 start . 数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == ...

  2. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  3. [LeetCode每日一题]153.寻找旋转排序数组中的最小值

    [LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...

  4. [LeetCode每日一题]81. 搜索旋转排序数组 II

    [LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ...

  5. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素2

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素2 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  6. 【python】Leetcode每日一题-搜索排序数组2

    [python]Leetcode每日一题-搜索排序数组2 [题目描述] 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k( ...

  7. 【python】Leetcode每日一题-删除有序数组中的重复项2

    [python]Leetcode每日一题-删除有序数组中的重复项2 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不 ...

  8. 【js】Leetcode每日一题-解码异或后数组

    [js]Leetcode每日一题-解码异或后数组 [题目描述] 未知 整数数组 arr 由 n 个非负整数组成. 经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encode ...

  9. 【python】Leetcode每日一题-删除有序数组中的重复项

    [python]Leetcode每日一题-删除有序数组中的重复项 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现一次 ,返回删除后数组的新长度. 不要 ...

  10. [LeetCode每日一题]80. 删除有序数组中的重复项 II

    [LeetCode每日一题]80. 删除有序数组中的重复项 II 问题 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外 ...

随机推荐

  1. LCR 164. 破解闯关密码

    破解闯关密码 闯关游戏需要破解一组密码,闯关组给出的有关密码的线索是: 一个拥有密码所有元素的非负整数数组 password 密码是 password 中所有元素拼接后得到的最小的一个数 请编写一个程 ...

  2. .NetCore Docker test

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 ...

  3. IT系统架构的演化-copy

    前言 一个成熟的大型网站(如淘宝.天猫.腾讯等)的系统架构并不是一开始设计时就具备完整的高性能.高可用.高伸缩等特性的,它是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式.技术 ...

  4. w3cschool-OpenResty 最佳实践Library

    https://www.w3cschool.cn/openresty1/ OpenResty LRR 访问有授权验证的 Redis 2.不重启Redis设置密码: 在配置文件中配置requirepas ...

  5. Mac安装NTL库

    Mac安装NTL库 NTL是一个高性能.可移植的C++库,为任意长度的整数提供数据结构和算法:用于整数和有限域上的向量.矩阵和多项式:以及任意精度的浮点运算. 具有以下功能: 任意长度整数运算和任意精 ...

  6. 分圆多项式(cyclotomic polynomial)

    最近论文中经常遇到分圆多项式,现在系统的学习一下! 本原单位根 之前介绍n次单位根,现在详细学习一下n次本原单位根(n-th primitive unit root) 一个复数是n次单位根,当且仅当具 ...

  7. 【推荐】一款.NET Core开发的开源免费功能完善的医疗影像PACS系统

    项目介绍 今天给大家推荐一款开源(MIT License开源协议).免费.完善.轻量级的医疗影像PACS系统,基于.NET Core 的 DICOM SCP(Service Class Provide ...

  8. Solon Cloud Gateway 开发:导引

    Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现). 分布式网关的特点(相对于本地网关): 提供服务路由能力 提供各种拦截支持 1.分布式网关推 ...

  9. windows 安装Nacos步骤

    一.Nacos中文文档网址 1.Nacos官网地址:https://nacos.io/en-us/ Nacos中文文档网址:Nacos 快速开始https://nacos.io/zh-cn/docs/ ...

  10. 十二. Redis 集群操作配置(超详细配图,配截图详细说明)

    十二. Redis 集群操作配置(超详细配图,配截图详细说明) @ 目录 十二. Redis 集群操作配置(超详细配图,配截图详细说明) 1. 为什么需要集群-高可用性 2. 集群概述(及其搭建) 3 ...