comments | difficulty | edit_url | rating | source | tags | ||
---|---|---|---|---|---|---|---|
true |
简单 |
1558 |
第 12 场双周赛 Q2 |
|
首先,给你一个初始数组 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 <= arr.length <= 100
1 <= arr[i] <= 100
每次模拟一天,对于每个元素,如果它大于左右邻居,则自减 1,否则自增 1。如果数组在某一天不再发生变化,则返回该数组。
时间复杂度
class Solution:
def transformArray(self, arr: List[int]) -> List[int]:
f = True
while f:
f = False
t = arr[:]
for i in range(1, len(t) - 1):
if t[i] > t[i - 1] and t[i] > t[i + 1]:
arr[i] -= 1
f = True
if t[i] < t[i - 1] and t[i] < t[i + 1]:
arr[i] += 1
f = True
return arr
class Solution {
public List<Integer> transformArray(int[] arr) {
boolean f = true;
while (f) {
f = false;
int[] t = arr.clone();
for (int i = 1; i < t.length - 1; ++i) {
if (t[i] > t[i - 1] && t[i] > t[i + 1]) {
--arr[i];
f = true;
}
if (t[i] < t[i - 1] && t[i] < t[i + 1]) {
++arr[i];
f = true;
}
}
}
List<Integer> ans = new ArrayList<>();
for (int x : arr) {
ans.add(x);
}
return ans;
}
}
class Solution {
public:
vector<int> transformArray(vector<int>& arr) {
bool f = true;
while (f) {
f = false;
vector<int> t = arr;
for (int i = 1; i < arr.size() - 1; ++i) {
if (t[i] > t[i - 1] && t[i] > t[i + 1]) {
--arr[i];
f = true;
}
if (t[i] < t[i - 1] && t[i] < t[i + 1]) {
++arr[i];
f = true;
}
}
}
return arr;
}
};
func transformArray(arr []int) []int {
f := true
for f {
f = false
t := make([]int, len(arr))
copy(t, arr)
for i := 1; i < len(arr)-1; i++ {
if t[i] > t[i-1] && t[i] > t[i+1] {
arr[i]--
f = true
}
if t[i] < t[i-1] && t[i] < t[i+1] {
arr[i]++
f = true
}
}
}
return arr
}