1243. Array Transformation
leetcode easy
Task
Если задан исходный массив arr, то каждый день вы создаете новый массив, используя массив предыдущего дня. В i-й день вы выполняете следующие операции над массивом дня i-1, чтобы получить массив дня i: если элемент меньше своего левого и правого соседа, то этот элемент увеличивается. Если элемент больше своего левого и правого соседа, то этот элемент уменьшается. Первый и последний элементы никогда не меняются. Через несколько дней массив не меняется. Верните этот окончательный массив.
Пример:
Input: arr = [6,2,3,4]
Output: [6,3,3,4]
C# solution
matched/originalusing System;
using System.Collections.Generic;
public class Solution {
public int[] TransformArray(int[] arr) {
bool changed;
do {
changed = false;
int[] newArr = (int[])arr.Clone();
for (int i = 1; i < arr.Length - 1; i++) {
if (arr[i] < arr[i - 1] && arr[i] < arr[i + 1]) {
newArr[i]++;
changed = true;
} else if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) {
newArr[i]--;
changed = true;
}
}
arr = newArr;
} while (changed);
return arr;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public vector<int>& TransformArray(vector<int>& arr) {
bool changed;
do {
changed = false;
vector<int>& newArr = (int[])arr.Clone();
for (int i = 1; i < arr.size() - 1; i++) {
if (arr[i] < arr[i - 1] && arr[i] < arr[i + 1]) {
newArr[i]++;
changed = true;
} else if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) {
newArr[i]--;
changed = true;
}
}
arr = newArr;
} while (changed);
return arr;
}
}Java solution
matched/originalimport java.util.Arrays;
public class Solution {
public int[] transformArray(int[] arr) {
boolean changed;
do {
changed = false;
int[] newArr = arr.clone();
for (int i = 1; i < arr.length - 1; i++) {
if (arr[i] < arr[i - 1] && arr[i] < arr[i + 1]) {
newArr[i]++;
changed = true;
} else if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1]) {
newArr[i]--;
changed = true;
}
}Python solution
matched/originaldef transformArray(arr):
while True:
new_arr = arr[:]
changed = False
for i in range(1, len(arr) - 1):
if arr[i] < arr[i - 1] and arr[i] < arr[i + 1]:
new_arr[i] += 1
changed = True
elif arr[i] > arr[i - 1] and arr[i] > arr[i + 1]:
new_arr[i] -= 1
changed = True
if not changed:
break
arr = new_arr
return arrGo solution
matched/originalfunc transformArray(arr []int) []int {
changed := true
for changed {
changed = false
newArr := make([]int, len(arr))
copy(newArr, arr)
for i := 1; i < len(arr)-1; i++ {
if arr[i] < arr[i-1] && arr[i] < arr[i+1] {
newArr[i]++
changed = true
} else if arr[i] > arr[i-1] && arr[i] > arr[i+1] {
newArr[i]--
changed = true
}
}
arr = newArr
}
return arr
}Explanation
Algorithm
Инициализация нового массива с такими же значениями, как у исходного массива.
Циклически изменяем массив в соответствии с правилами, пока он не перестанет меняться.
Для каждого элемента массива проверяем, изменяется ли он в зависимости от его левого и правого соседей.
Если элемент меньше своего левого и правого соседей, увеличиваем его.
Если элемент больше своего левого и правого соседей, уменьшаем его.
Первый и последний элементы массива остаются неизменными.
😎