zoukankan      html  css  js  c++  java
  • [leetcode 周赛 148] 1144 递减元素使数组呈锯齿状

    1144 Decrease Elements To Make Array Zigzag 递减元素使数组呈锯齿状

    描述

    给你一个整数数组 nums,每次 操作 会从中选择一个元素并 将该元素的值减少 1
    如果符合下列情况之一,则数组 A 就是 锯齿数组

    • 每个偶数索引对应的元素都大于相邻的元素,即 A[0] > A[1] < A[2] > A[3] < A[4] > ...
    • 或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3] > A[4] < ...

    返回将数组 nums 转换为锯齿数组所需的最小操作次数。

    • 示例 1:

    输入:nums = [1,2,3]
    输出:2
    解释:我们可以把 2 递减到 0,或把 3 递减到 1。

    • 示例 2:

    输入:nums = [9,6,1,6,2]
    输出:4

    • 提示:

    1 <= nums.length <= 1000
    1 <= nums[i] <= 1000

    思路

    首先看清条件:

    1. 每次操作减一
    2. 偶数索引/奇数索引元素大于相邻元素

    可以看做为:
    通过减一操作, 将偶数索引/奇数索引元素减少至小于相邻的元素, 如此奇数索引/偶数索引的元素就大于相邻元素!!!

    这是一种贪心算法, 最终两种情况相比较, 选取最小的那个输出.

    代码实现

    class Solution {
        public int movesToMakeZigzag(int[] nums) {
            if (null == nums || nums.length == 0) return -1;
            if (nums.length == 1) return 0;
            if (nums.length == 2) {
                return nums[0] == nums[1] ? 1 : 0;
            }
            
            // j 表示当前元素与相邻元素的差值
            //      差值含义: 为正表示需要减少的操作次数 
            //               为负则不用理会(已经符合条件)
            // s 表示偶数索引符合条件需要的操作次数
            // t 表示奇数索引符合条件需要的操作次数
            // n 表示数组长度
            int j = 0, s = 0, t = 0, n = nums.length;
            // 计算偶数索引需要减少多少次数才能符合条件
            for (int i = 0; i < n; i += 2) {
                j = 0;
                // 索引0不能往前运算
                if (i != 0) j = Math.max(j, nums[i] - nums[i-1] + 1);
                // 尾部索引不能往后运算
                if (i+1 < n) j = Math.max(j, nums[i] - nums[i+1] + 1);
                s += j;
            }
            // 计算奇数索引需要减少多少次数才能符合条件
            for (int i = 1; i < n; i += 2) {
                j = 0;
                if (i != 0) j = Math.max(j, nums[i] - nums[i-1] + 1);
                if (i+1 < n) j = Math.max(j, nums[i] - nums[i+1] + 1);
                t += j;
            }
            
            return Math.min(s, t);
        }
    }
    
  • 相关阅读:
    init_machine 在Kernel中被调用的过程
    maven-surefire-plugin的forkMode分析
    执行Maven install或Maven test命令时控制台输出乱码的解决办法
    Maven 中的dependencies与dependencyManagement的区别
    使用maven profile实现多环境可移植构建
    Maven最佳实践:划分模块
    MySQL的登陆错误:ERROR 1049 (42000): Unknown database 'root'
    Java 连接操作 Redis 出现错误
    关闭多个screen
    linux sed 批量替换字符串
  • 原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11303634.html
Copyright © 2011-2022 走看看