15天算法入门(三)

807 阅读1分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

image.png

移动零

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

题解

思路一:
遍历数组,将为0的数删除。最后将后面缺失的位置补0。

image.png

思路二:
使用左右指针指向为0的左右边界。当遍历遇到不为0的数值时,将该值与左边界的0交换,左右边界向后移;遇到的值为0时,直接扩展0的有边界,继续下一步骤。

image.png

image.png

代码

思路一:

var moveZeroes = function (nums) {
    let len = nums.length - 1
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] == 0) {
            nums.splice(i, 1)
            i--
        }
    }
    while (nums.length <= len) {
        nums.push(0)
    }
    return nums
};

思路二:

var moveZeroes = function (nums) {
    let l = 0, r = 0, index = 0
    while (index < nums.length) {
        if (nums[index] == 0) {
            r = index++
        } else {
            swap(nums, l++, index++)
            r++
        }
    }
    return nums
};
function swap(arr, i, j) {
    let temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
}

image.png

两数之和 II - 输入有序数组

题目

给定一个已按照 升序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2

题解

在输入的数组中,必然有唯一一对答案存在,所以我们可以忽略没有的情况。顺序数组中使用左右指针,分别指向头和尾。判断两者相加情况:相等直接返回;大于目标值,说明尾部数值过大,缩小范围,将右指针左移;小于目标值,说明左指针数值过小,左指针右移。直到左右指针相遇。

image.png

代码

var twoSum = function (numbers, target) {
    let l = 0, r = numbers.length - 1, mid
    while (l < r) {
        if (numbers[l] + numbers[r] === target) return [l + 1, r + 1]
        if (numbers[l] + numbers[r] > target) r--
        else if (numbers[l] + numbers[r] < target) l++
    }
    return [-1, -1]
};

题目来源:leetcode