力扣上那些适合新手的算法题(一)

159 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

前言

有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来😁😁

算法题不一定很抽象,也不一定很难。今天就盘点一下,力扣那些适合新手的入门题

1.二分查找(704)

给定一个升序数组和待查找元素,返回元素在数组的位置没有返回-1。

思路:通过中间元素跟待查找元素比大小,根据:mid = left + Math.floor((right - left) / 2) 来决定下次查找中间键往哪靠,最左边最右边怎么变。大了:中间键就得往左,因为left不变,整体值变小,所以right 要变小,反之同理。

var search = function(nums, target) {
    let left=0;
    let right =nums.length -1;
    while(left <= right){
        let mid = left + Math.floor((right - left) / 2);
        const num=nums[mid];
        if(nums[mid] == target){
            return mid;
        }else if(num < target){
                left = mid + 1;
        }else{
                right = mid - 1;
        }
    }
    return -1;
};

2.第一个错误版本(208)

二分查找的异化,也是一串有序数组,第N个数及后面通过isBadVersion()为true,其余false,找到这个N。

思路:上面是对比大小,这里是对比布尔值,为真就说明超过那个N了,这里就更新右边边界,为假就说明还没到,更新左边边界,不断缩小区间。我想过如果中间值恰巧是N,这里也不能直接返回right值结束,因为这样会增加判断次数由此增加执行时间。

var solution = function(isBadVersion) {
    return function(n) {
        let left =1;
        let right =n;
        while(left < right ){
            const mid =left+ Math.floor((right-left)/2);
            if(isBadVersion(mid)){
                right =mid;
            }else{
                left =mid+1;
            }
        }
        return left;
    };
};

3.搜索插入位置(35)

例子:

输入: nums = [1,3,5,6], target = 5 输出: 2

输入: nums = [1,3,5,6], target = 7 输出: 4

模版小改,整体思路差不多

var searchInsert = function(nums, target) {
const n = nums.length;
    let left = 0, right = n - 1, ans = n;
    while (left <= right) {
        let mid = ((right - left) >> 1) + left;
        if ( nums[mid] >= target ) {
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return ans;
};

4.有序数组的平方(977)

这题就很直观了,思路直接就是平方之后在排序,下面这种是最简单直观的。

var sortedSquares = function(nums) {
    var arr = []
    for(var i= 0;i < nums.length;i++){
        arr.push(Math.pow(nums[i],2))
    }
    arr.sort((a,b) =>{
    return a-b;
    })
    return arr;
};

或者利用双指针排序,因为题目说了是非递减顺序数组(就是按自然数序列排布),这说明最大值要么是最左边要么是最右边,所以在最开始判断哪边值最大,就可以 以此写入。

var sortedSquares = function(nums) {
        let left = 0;
        let right = nums.length - 1;
        let result = [];
        let write = nums.length - 1;
        while (left <= right){
            if (Math.pow(nums[left],2) > Math.pow(nums[right],2)){
                result[write] = Math.pow(nums[left],2);
                left ++;
                write --;
            }
            else {
                result[write] = Math.pow(nums[right],2);
                right --;
                write --;
            }
        }
        return result;
};

5.旋转数组(189)

将数组整体向右移N个数,输出移动后的数组。

这里考点就是怎么处理N位后元素,超过数组边界的从头开始计算,这里我想到了取余方式安置元素,将整个数组进行重新绘制后输出。

var rotate = function(nums, k) {
  const n = nums.length;
    const newArr = new Array(n);
    for (let i = 0; i < n; ++i) {
        newArr[(i + k) % n] = nums[i];
    }
    for (let i = 0; i < n; ++i) {
        nums[i] = newArr[i];
    }
    return nums;
};

后续会持续更新算法题中的那些软柿子🥰🥰