开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
最少操作使数组递增
题目描述
解题思路
使用贪心算法,循环遍历数组,比较每个数和前一个数的大小,如果当前数比前一个数大,则不操作,反之则计算和前一个数的差dif,则当前数需要的最小操作数为dif+1,需要注意的是当前数也要同时加上dif+1,不然下个数的计算会出错。 可以很很简单的写出一下代码:
var minOperations = function(nums) {
let count = 0;
if(nums.length <= 1) { // 如果数组长度小于1需要单独处理
return 0
} else {
for(let i = 1; i<nums.length;i++){
if(nums[i] > nums[i-1]) {
continue;
} else {
let dif = nums[i-1] - nums[i]
nums[i] += dif + 1; // 这一步不能少
count += dif + 1
}
}
}
return count;
};
题目描述
解题思路
本题可以采用递归的方式来解决,首先我们需要清楚三个点:
1.递归的终止条件
当list1或者list2为空时,一个链表已经比较完毕,另一个链表的剩下的节点都是已经排好序的,两个链表拼接完成,递归结束
2.递归返回值
每一次递归都返回已经排序好的链表头节点
3.递归的表达式
当list1值大于等于list2时,list2.next = mergeTwoLists(list1,list2.next), list2.next与排好序的链表头节点相接
当list1值小于list2时,list1.next = mergeTwoLists(list1.next,list2),list1.next与排好序的链表头节点相接
var mergeTwoLists = function(list1, list2) {
if(list1 == null) {
return list2
} else if(list2 == null) { // 当某个节点为空时结束递归 条件一
return list1
} else if(list1.val >= list2.val) { // 将list2.next继续进入递归 条件三
list2.next = mergeTwoLists(list1,list2.next)
return list2 // 条件二
} else {
list1.next = mergeTwoLists(list1.next,list2)
return list1
}
};