15天算法入门(二)

426 阅读2分钟

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

image.png

有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

 

示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

题解

将该题转为求最小值位置,然后顺序排序。先将数组中数值平方后,然后求得最小值的位置。将最小值放到一个新的数组中。

使用归并排序核心,左右指针遍历数组,将从最小值位置分别向两端遍历,将小的放到新的数组中。返回改新数组。

image.png

找到最小值位置后,左右两边为l、r指针。比较两者所指位置的值,将小值放入到新的数组中,对应的指针移动一步。

image.png

在左右指针有一边走到头时,就单独遍历没有走到头的一边。

代码

var sortedSquares = function (nums) {
    let min = 0
    for (let i = 0; i < nums.length; i++) {
        nums[i] = Math.pow(nums[i], 2)
        min = nums[min] > nums[i] ? i : min
    }
    let arr = []
    arr[0] = nums[min]
    let l = min - 1, r = min + 1, index = 1
    while (l >= 0 && r < nums.length) arr[index++] = nums[l] > nums[r] ? nums[r++] : nums[l--]
    while (l >= 0) arr[index++] = nums[l--]
    while (r < nums.length) arr[index++] = nums[r++]
    return arr
};

旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

题解

思路一:
使用新的数组,将倒数k个数push到新数组中(nums.length - k +1),然后将0到nums.length - k个数顺序push到数组中。最后返回新的数组。

image.png 思路二:
在原数组上,将末尾的数出栈,使用变量存贮,然后从头部压入,循环k次。

image.png 思路三:
搞一个从i到j位置反转数组的函数。先将数组整体反转。然后,从k位置分开,两边分别反转。

image.png

代码

思路三:

var rotate = function (nums, k) {
    reverse(nums, 0, nums.length - 1)
    reverse(nums, 0, (k % nums.length) - 1)
    reverse(nums, (k % nums.length), nums.length - 1)
    return nums
};
function reverse(nums, i, j) {
    while (i < j) {
        swap(nums, i++, j--)
    }
}
function swap(nums, i, j) {
    let temp = nums[i]
    nums[i] = nums[j]
    nums[j] = temp
}

题目来源:leetcode