2021/3/24算法

归并两个有序数组

在这里插入图片描述
思路:首先这是两个有序的数组,并且不能开辟额外的空间,所以可以依次从两个数组的末尾开始比较,并将较大的数字放在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]
        }
    }
};

分糖果问题
在这里插入图片描述
因为评分高的孩子总是比身旁的孩子多一颗糖。可以分两次来分糖果,可以先从左往右判断左边比右边高,左边的糖果加一,再从右往左,如果右边比左边高,右边糖果加一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值