力扣刷题记录——1287. 有序数组中出现次数超过25%的元素、1299. 将每个元素替换为右侧最大元素 、1413. 逐步求和得到正数的最小值

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——1287. 有序数组中出现次数超过25%的元素1299. 将每个元素替换为右侧最大元素1413. 逐步求和得到正数的最小值 》。 不知不觉刷了100道力扣题啦!接下来转刷蓝桥杯的真题!

目录

1287. 有序数组中出现次数超过25%的元素

        题目描述

        解题思路

        解题代码 

1299. 将每个元素替换为右侧最大元素

        题目描述

        解题思路

        解题过程

1413. 逐步求和得到正数的最小值 

        题目描述

        解题思路

        解题代码 


1287. 有序数组中出现次数超过25%的元素

题目描述

给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。

请你找到并返回这个整数

示例:

输入:arr = [1,2,2,6,6,6,6,7,10]
输出:6

解题思路

恰好有一个整数超过25%,说明这个整数是出现次数最多的,所以只要找到出现次数最多的元素就可以了。

解题代码 

def findSpecialInteger(arr: list[int]) -> int:
    num_dic = {}
    for i in set(arr):
        num_dic[arr.count(i)] = i
    return num_dic[max(list(num_dic.keys()))]

1299. 将每个元素替换为右侧最大元素

题目描述

给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。

完成所有替换操作后,请你返回这个数组。

示例 1:

输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]
解释:
- 下标 0 的元素 --> 右侧最大元素是下标 1 的元素 (18)
- 下标 1 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 2 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 3 的元素 --> 右侧最大元素是下标 4 的元素 (6)
- 下标 4 的元素 --> 右侧最大元素是下标 5 的元素 (1)
- 下标 5 的元素 --> 右侧没有其他元素,替换为 -1

示例 2:

输入:arr = [400]
输出:[-1]
解释:下标 0 的元素右侧没有其他元素。

解题思路

用for循环,用列表切割的方式找到最大值,最后一个元素用-1,返回目标元素。

解题过程

def replaceElements(arr: list[int]) -> list[int]:
    if len(arr) == 1:
        return [-1]
    else:
        result = []
        for i in range(len(arr)):
            if i == len(arr)-1:
                result.append(-1)
            else:
                result.append(max(arr[i+1::]))
        return result

超出时间限制,arr[i+1::]那里有很大问题,每一次都要开辟新的空间。逆向比较,并且使用动态规划的思想求解。

def replaceElements(arr: list[int]) -> list[int]:
    if len(arr) == 1:
        return [-1]
    else:
        n = len(arr)  # 获得长度
        Max = max(0, arr[n - 1])  # 获得最大值
        arr[n - 1] = -1  # 不管结果如何,最后一个都是-1(初始化)
        for i in range(n - 2, -1, -1):  # 反向迭代倒数两个之前的数(因为最后一组为-1)
            temp = arr[i]  # 每次迭代获取一次该下标对应的值
            arr[i] = Max  # 将刚刚得出的最大值存入该位置
            Max = max(temp, Max)  # 比对最大值,重置最大的
        return arr

1413. 逐步求和得到正数的最小值 

题目描述

给你一个整数数组 nums 。你可以选定任意的 正数 startValue 作为初始值。

你需要从左到右遍历 nums 数组,并将 startValue 依次累加上 nums 数组中的值。

请你在确保累加和始终大于等于 1 的前提下,选出一个最小的 正数 作为 startValue 。

示例 1:

输入:nums = [-3,2,-3,4,2]
输出:5
解释:如果你选择 startValue = 4,在第三次累加时,和小于 1 。
                累加求和
                startValue = 4 | startValue = 5 | nums
                  (4 -3 ) = 1  | (5 -3 ) = 2    |  -3
                  (1 +2 ) = 3  | (2 +2 ) = 4    |   2
                  (3 -3 ) = 0  | (4 -3 ) = 1    |  -3
                  (0 +4 ) = 4  | (1 +4 ) = 5    |   4
                  (4 +2 ) = 6  | (5 +2 ) = 7    |   2

示例 2:

输入:nums = [1,2]
输出:1
解释:最小的 startValue 需要是正数。

示例 3:

输入:nums = [1,-2,-3]
输出:5

解题思路

累加通过一个列表记录,返回列表最小值,如果是正数直接返回1,是负数返回相反数+1。

解题代码 

def minStartValue(nums: list[int]) -> int:
    temp = []
    all_num = 0
    for i in range(len(nums)):
        all_num += nums[i]
        temp.append(all_num)
    print(temp)
    min_num = min(temp)
    if min_num >=0:
        return 1
    else:
        return -min_num+1

猜你喜欢

转载自blog.csdn.net/weixin_63866037/article/details/128878477