归并两个有序数组
思路:首先这是两个有序的数组,并且不能开辟额外的空间,所以可以依次从两个数组的末尾开始比较,并将较大的数字放在nums1的末尾,分别用m,n代表在nums1和nums2中指向各自当前元素的指针。方便取到对应的元素。我们也需要第三个指针pos,代表较大数字被放入的位置。伪代码就是。
比较nums1[m-1],nums2[n-1]将较大的值赋给nums1[pos],pos的值等于m+n-1,也就是
nums1[pos]=nums1[m-1]>nums2[n-1]?nums1[m-1]:nums2[n-1],依次比较,所以要用到循环while,跳出循环的条件是m或者n移动到了最左边。while(m>=0||n>=0),但如果m已经移动到了最左端,n还没有移动到最左端,这个时候还需要继续将nums2[n]的值赋给nums1[pos],但如果n移动到了最左端,m没有,那么其实m已经排好序了,所以只需考虑,n没到达最左端的情况。
代码如下:
var merge = function(nums1, m, nums2, n) {
let pos=m+n-1
m=m-1
n=n-1
while(m>=0&&n>=0){
if(nums1[m]>nums2[n]){
nums1[pos]=nums1[m]
m--
}else{
nums1[pos]=nums2[n]
n--
}
pos--
}
while(n>=0){
nums1[pos]=nums2[n]
n--
pos--
}
return nums1
};
简化如下
var merge = function(nums1, m, nums2, n) {
let pos=m--+n---1
console.log(pos,m,n)
while(m>=0&&n>=0){
nums1[pos--]=nums1[m]>nums2[n]?nums1[m--]:nums2[n--]
}
while(n>=0){
nums1[pos--]=nums2[n--]
}
return nums1
};
两数之和
解题思路:双指针,因为是有序数组,所以,从左往右是升序的,分别用两个指针left,right指向一头一尾,将两个指针指向的值相加和目标值进行比较,如果大于目标值,那么就应该将右边的指针左移,因为左边的总是比右边小。如果比目标值小,就将左边指针右移,向目标值靠近。
代码如下:
var twoSum = function(numbers, target) {
let left=0,right=numbers.length-1
let currentSum=numbers[left]+numbers[right]
while(left!==right){
let currentSum=numbers[left]+numbers[right]
if(currentSum>target){
right--
}else if(currentSum<target){
left++
}else{
return[left+1,right+1]
}
}
};
分糖果问题
因为评分高的孩子总是比身旁的孩子多一颗糖。可以分两次来分糖果,可以先从左往右判断左边比右边高,左边的糖果加一,再从右往左,如果右边比左边高,右边糖果加一。