88. 合并两个有序数组
splice() 方法向/从数组添加/删除项目,并返回删除的项目。可以添加。
var merge = function(nums1, m, nums2, n) { nums1.splice(m,n,...nums2); nums1.sort(function(a,b){return a-b}); };
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。该方法会改变原始数组。
var merge = function(nums1, m, nums2, n) { nums1.splice(m,n); nums1=[...nums1,...nums2]; nums1.sort(function(a,b){return a-b}); };//不可行,运行后nums1长度为m,不再是m+n
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。是一种栈的方式。
var merge = function(nums1, m, nums2, n) { nums1.splice(m,n); nums1.push(...nums2); nums1.sort(function(a,b){return a-b}); };//但用push是可以的,而且比splice直接添加速度更快!
283. 移动零
理解双指针,其实就是定位两种标志。
本题可以一个0,一个非零,依次遍历就可以了,将0和非0交换位置。
var moveZeroes = function(nums) { let j=0; for(let i=0;i<nums.length;i++){ if(nums[i]!=0){ if(i!=j){[nums[j],nums[i]]=[nums[i],nums[j]];}//注意交换的用法 j++; } } return nums; };
122. 买卖股票的最佳时机 II
可以多次购买,只要是上升趋势都可以购买。
var maxProfit = function(prices) { let max = min = prices[0]; let lirun = sum = 0; for(let num of prices){ if(Math.max(num,max) == num){ max = Math.max(num,max); min = Math.min(num,min); lirun = Math.max(max-min,lirun); } else{ max = num; min = num; sum += lirun; lirun = 0; } } if(lirun!=0){sum += lirun;} return sum; };
更简洁的贪心算法,不是实际买卖时间,只要是上升的就算利润。
var maxProfit = function(prices) { let len = prices.length; let sum = 0; for(let i = 1;i<len;i++){ sum+=Math.max(0,prices[i]-prices[i-1]) } return sum; };
简单数组题到此结束,这类题大多只需要一个循环。若是n2复杂度,则要考虑如何加变量,双指针来减少一次循环。
注意,数组sort函数不能直接用于数字排序,会有错误,需要function(a,b){return a-b}
splice函数不但可以删除也可以插入,会改变数组长度。
push,pop是栈的用法,不会改变数组长度。