Day1: 数组基础

704. 二分查找  27. 移除元素  977.有序数组的平方

704. 二分查找  

二分查找使用前提:

        1.有序数组

        2. 数组中无重复元素

大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

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

27. 移除元素  

双指针法

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置
function removeElement(nums: number[], val: number): number {
    let point1 = 0;
    for(let point2 = 0; point2 < nums.length; point2++){
        if(nums[point2] !== val){
            nums[point1++] = nums[point2];
        }
    }
    return point1;
};

977.有序数组的平方

双指针法

function sortedSquares(nums: number[]): number[] {
  let left = 0, right = nums.length - 1;
  let result = []
  while(left <= right){
    if(Math.abs(nums[left]) > Math.abs(nums[right])){
        result.unshift(nums[left] * nums[left]);
        left++;
    } else {
        result.unshift(nums[right] * nums[right]);
        right--;
    }
  }
  return result;
};
function sortedSquares(nums: number[]): number[] {
    return nums.map(n => n*n).sort((a,b) => a - b);
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值