「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」
前言
每日一题,轻松解题
每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。
正文
:递减元素使数组呈锯齿状
难度:中等
题目要求:
给你一个整数数组 nums,每次 操作 会从中选择一个元素并 将该元素的值减少 1。
如果符合下列情况之一,则数组 A 就是 锯齿数组:
每个偶数索引对应的元素都大于相邻的元素,即 A[0] > A[1] < A[2] > A[3] < A[4] > ...
或者,每个奇数索引对应的元素都大于相邻的元素,即 A[0] < A[1] > A[2] < A[3] > A[4] < ...
返回将数组 nums 转换为锯齿数组所需的最小操作次数。
分析题目:
一个数组,每次可以使其中一项的值减一,最后要使偶数都大于相邻的值,或者奇数都大于相邻的值,最后返回最少需要操作几次。
举个例子
输入: nums = [1,2,3]
输出: 2
解释: 我们可以把 2 递减到 0,或把 3 递减到 1。
:解题
理清思路:
分析:
因为所有数字只能递减,所以我们找到根据要求需要递减的数,分两种情况
1)对于偶数索引都要大于相邻元素的我们判断奇数索引位,因为此时奇数索引位需要小于两边的数据,则
num[i-1]>num[i]<num[i+1],此时如果元数据不满足则需要调整的就是奇数索引数据,判断与两边的差值,比如元数据是7>8<5,则8-7=1<8-5=3,取大的值,元数据需要调整为8-(3+1)=4,调整次数为4
2)同上,此时判断偶数索引位
编辑代码:
1.首先定义一个函数,传入一个字符串,
function toSawtooth (nums) {
const length = nums.length;
if (length === 1 || length === 2) {
return 0;
}
};
- (参数检验)先判断字符串是否是三个字符以上的
- 只有三个字符以上,才能构成锯齿字符串
2.定义变量,拷贝数组
let oddSum = 0, evenSum = 0;
// 拷贝一下是为了在后面减数的时候不修改原数组
const copy1 = [...nums];
const copy2 = [...nums];
- 定义两个变量,分别存放改变偶数和奇数到符合条件需要的次数
- 拷贝数组
3.遍历数组,判断改变奇数还是偶数
// 奇数
for (let i = 1; i < length; i += 2) {
//判断左边
if (copy1[i - 1] >= copy1[i]) {
// 变化的步长就是 copy1[i - 1] - copy1[i] + 1
// 下面的都同理
oddSum += (copy1[i - 1] - copy1[i] + 1);
copy1[i - 1] -= (copy1[i - 1] - copy1[i] + 1);
};
//判断右边
if (copy1[i + 1] >= copy1[i]) {
oddSum += (copy1[i + 1] - copy1[i] + 1);
copy1[i + 1] -= (copy1[i + 1] - copy1[i] + 1);
};
}
//偶数
for (let i = 0; i < length; i += 2) {
//判断左边
if (copy2[i - 1] >= copy2[i]) {
evenSum += (copy2[i - 1] - copy2[i] + 1);
copy2[i - 1] -= (copy2[i - 1] - copy2[i] + 1);
};
//判断右边
if (copy2[i + 1] >= copy2[i]) {
evenSum += (copy2[i + 1] - copy2[i] + 1);
copy2[i + 1] -= (copy2[i + 1] - copy2[i] + 1);
};
}
return Math.min(oddSum, evenSum);
- 两个for循环分别判断奇偶数需要的步数
- for循环中有两个if 分别判断与左边和右边大小比较,如果小于,次数加一,再次判断
- 最后将两个步数用来比较,哪个小就是最少操作数
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。