数组变换

Submission

运行时间: 28 ms

内存: 16.7 MB

from typing import List

class Solution:
    def transformArray(self, arr: List[int]) -> List[int]:
        n = len(arr)
        while True:
            changed = False
            new_arr = [arr[0]]  # Create a new array with the first element
            
            for i in range(1, n - 1):
                if arr[i] < arr[i - 1] and arr[i] < arr[i + 1]:
                    new_arr.append(arr[i] + 1)
                    changed = True
                elif arr[i] > arr[i - 1] and arr[i] > arr[i + 1]:
                    new_arr.append(arr[i] - 1)
                    changed = True
                else:
                    new_arr.append(arr[i])
            
            new_arr.append(arr[-1])  # Append the last element to the new array
            
            if not changed:
                return new_arr
            
            arr = new_arr  # Update the array for the next iteration

# Test the solution
solution = Solution()
print(solution.transformArray([6, 2, 3, 4]))  # Output: [6, 3, 3, 4]
print(solution.transformArray([1, 6, 3, 4, 3, 5]))  # Output: [1, 4, 4, 4, 4, 5]

Explain

解题思路是采用迭代方法对数组进行变换。在每次迭代中,我们创建一个新数组,从头到尾检查每个元素。如果一个元素比它的前一个和后一个元素都小,则将其加一;如果一个元素比它的前一个和后一个元素都大,则将其减一。如果数组在某次迭代后没有发生任何变化,即没有元素被加一或减一,那么迭代结束,输出最终的数组。

时间复杂度: O(kn)

空间复杂度: O(n)

from typing import List

class Solution:
    def transformArray(self, arr: List[int]) -> List[int]:
        n = len(arr)  # 获取数组长度
        while True:
            changed = False  # 标记数组在本次迭代中是否发生了变化
            new_arr = [arr[0]]  # 创建新数组并初始化为第一个元素
            
            for i in range(1, n - 1):
                if arr[i] < arr[i - 1] and arr[i] < arr[i + 1]:
                    new_arr.append(arr[i] + 1)  # 符合增加条件
                    changed = True
                elif arr[i] > arr[i - 1] and arr[i] > arr[i + 1]:
                    new_arr.append(arr[i] - 1)  # 符合减少条件
                    changed = True
                else:
                    new_arr.append(arr[i])  # 保持当前值
            
            new_arr.append(arr[-1])  # 添加最后一个元素到新数组
            
            if not changed:
                return new_arr  # 如果没有变化,返回结果
            
            arr = new_arr  # 用新数组更新原数组以进行下一次迭代

# Test the solution
solution = Solution()
print(solution.transformArray([6, 2, 3, 4]))  # Output: [6, 3, 3, 4]
print(solution.transformArray([1, 6, 3, 4, 3, 5]))  # Output: [1, 4, 4, 4, 4, 5]

Explore

该算法定义了迭代停止的条件为一次迭代后数组没有任何变化,即没有元素被增加或减少。这种情况确保了只要数组的状态发生了改变,迭代就会继续。因此,在理论上不会出现过早停止的问题。即使在数组较长或元素变化微小的情况下,只要任意元素需要调整,迭代就会继续。这种停止条件确保了算法只在达到稳定状态时停止,这时所有符合条件的元素已经被调整至不再需要变化。

在该算法中,数组的第一个和最后一个元素(边界元素)被直接添加到新数组中而没有进行任何增加或减少的操作。这种处理方式是基于边界元素只有一个相邻元素的事实,使得它们没有完全的比较基础来判断是否需要增减。这可能不会影响算法的整体效果,因为边界条件通常由问题本身的特性决定。然而,在某些特殊情况下,如果边界元素的处理对结果有重要影响,可能需要对算法进行调整,例如考虑边界元素与其内部相邻元素的关系,以确保更精确的处理。

算法通过在每次迭代中创建一个新数组来处理元素的连续变化。在每次迭代的开始,都基于上一次迭代的结果来判断每个元素是否需要增加或减少。这种方法确保了每次迭代都是基于最新的数组状态进行的,从而避免了在多次迭代中重复无效修改同一元素。此外,由于每次迭代后数组的状态都被重新评估,元素在增加后立即满足减少条件的情况将在下一次迭代中被处理,反之亦然。这保证了算法可以适应元素的连续变化,最终达到一个稳定状态。