LeetCode 5096. 数组变换

地址 https://leetcode-cn.com/contest/biweekly-contest-12/problems/array-transformation/

首先,给你一个初始数组 arr。然后,每天你都要根据前一天的数组生成一个新的数组。

第 i 天所生成的数组,是由你对第 i-1 天的数组进行如下操作所得的:

假如一个元素小于它的左右邻居,那么该元素自增 1。
假如一个元素大于它的左右邻居,那么该元素自减 1。
首、尾元素 永不 改变。
过些时日,你会发现数组将会不再发生变化,请返回最终所得到的数组。

例 1:

输入:[6,2,3,4]
输出:[6,3,3,4]
解释:
第一天,数组从 [6,2,3,4] 变为 [6,3,3,4]。
无法再对该数组进行更多操作。
示例 2:

输入:[1,6,3,4,3,5]
输出:[1,4,4,4,4,5]
解释:
第一天,数组从 [1,6,3,4,3,5] 变为 [1,5,4,3,4,5]。
第二天,数组从 [1,5,4,3,4,5] 变为 [1,4,4,4,4,5]。
无法再对该数组进行更多操作。

算法1
这道题 只是勉强做出来 优化的位置还有很多
完全的模拟题意
每次循环开了一个属猪 和询问数组一样的长的数组 依次检测每个元素 如果符合题意就在新开的数组里记录+1或者-1
最后把新开数组加进原数组
如果新开数组全部为零 那么就是没有变化 就 可以跳出循环

 1 class Solution {
 2 public:
 3     vector<int> transformArray(vector<int>& arr) {
 4         if(arr.size() == 1 || arr.size() == 2) return arr;
 5
 6         while(1){
 7             vector<int> addvec(arr.size(),0);
 8             for(int i = 1;i < arr.size()-1;i++){
 9                 if(arr[i] > arr[i-1] && arr[i]>arr[i+1]) addvec[i] = -1;
10                 else if(arr[i] < arr[i-1] && arr[i]<arr[i+1]) addvec[i] = 1;
11             }
12             int isAllZero = true;
13             for(int i = 0; i < addvec.size();i++){
14                 arr[i] += addvec[i];
15                 if(addvec[i] != 0) isAllZero =false;
16             }
17             if(isAllZero) break;
18         }
19
20
21         return arr;
22     }
23 };

原文地址:https://www.cnblogs.com/itdef/p/11785895.html

时间: 2024-08-30 17:50:54

LeetCode 5096. 数组变换的相关文章

leetcode旋转数组查找 二分查找的变形

http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return it

数组变换--全国模拟(三)

[编程题] 数组变换 时间限制:1秒 空间限制:32768K 牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等.问是否可行. 牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍. 这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次. 输入描述: 输入一个正整数N (N <= 50) 接下来一行输入N个正整数,每个数均小于等于1e9. 输出描述: 假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO&q

LeetCode:数组中的第K个最大元素【215】

LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 题目分析 我们主要来学习一个新的集合类型--优先队列.优先队列作用是保证每次取

leetcode之数组中找两数和为指定值

题目: Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note t

Leetcode 164 数组最大间隔(线性复杂度实现)//Python

LeetCode 地址:https://leetcode.com/problems/maximum-gap/description/ 题目描述 给定一个未排序数组,找出排序后的元素之间的最大间隔. 要求用线性时间复杂度实现. 例如:输入为[3,6,9,1,10],输出应为最大间隔3. 题目分析 线性时间复杂度实现,就说明不能先对元素进行排序,因为采用此法复杂度为O(n?log(n)) 思路是采用桶排序的方法. 首先,求随机数组中的最大元素 , 最小元素,为线性时间复杂度: 然后,在最大元素和最小

ndarray数组变换

1 import numpy as np 维度变换 1 a = np.arange(24) 2 a array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]) reshape(),视图,不修改原数组 1 a.reshape(4,6) array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15,

leetcode关于数组的问题

[Leetcode] 628. 三个数的最大乘积 解题思路: 这个一开始我是没想到思路的(除了遍历),因为有正负号的问题,后来看了一下别人的思路然后自己写的,思路是这样的: 三个数乘积最大只能有两种情况, 一种是三个最大正数直接乘起来最大, 另一种就是两个最小的负数乘起来再乘以一个最大的正数. 第一步: 跟前面的那个414.第三大的数一个思路,遍历找到最大的三个正数和最小的两个数. 第二步: 比较最大三个数的乘积和两个最小数乘以最大数的乘积谁大就返回谁. leetcode414-第三大的数 解释

【LeetCode】数组--合并区间(56)

写在前面   老粉丝可能知道现阶段的LeetCode刷题将按照某一个特定的专题进行,之前的[贪心算法]已经结束,虽然只有三个题却包含了简单,中等,困难这三个维度,今天介绍的是第二个专题[数组] 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据.在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构. 贪心算法回顾: [LeetCode]贪心算法--买卖股票的最佳时机II(122) [LeetC

[LeetCode]215. 数组中的第K个最大元素(堆)

题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例?2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-largest-ele