JavaScript / TypeScript for LeetCode (九十五)

是差点运气,可我一直在努力!

当前进程:

  • 开始时间:2020.6.27
  • 结束时间:undefined

GitHub仓库:https://github.com/Cundefined/JavaScript-or-TypeScript-for-LeetCode

1、题目要求

( LeetCode-第34题 ) 在排序数组中查找元素的第一个和最后一个位置

2、解题思路

方法:二分搜索

注意:由于需要找最开始和最后出现的位置,所以需要在找到一个target之后,
    判断要将当前的mid往左移动到左端,还是往右移动到右端!!!

2.1、JavaScript Solution

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var searchRange = function (nums, target) {
  let left = 0;
  let right = nums.length - 1;

  const res = [-1, -1];

  while (left <= right) {
    let mid = Math.floor(left + (right - left) / 2);

    if (nums[mid] === target) {
      let tempMid = mid;
      // 一直往左移,找到左端(最开始出现的位置),什么时候停呢,当发现nums[tempMid]不等于target时,
      // 说明刚刚移出到最左端,那么最左端就是当前位置加一
      while (tempMid >= left && nums[tempMid] === target) {
        tempMid--;
      }
      //记录最左端位置
      res[0] = tempMid + 1;

      //把tempMid移回原来的位置
      tempMid = mid;

      while (tempMid <= right && nums[tempMid] === target) {
        tempMid++;
      }
      //记录最右端位置
      res[1] = tempMid - 1;

      //都找到后,退出循环
      break;
    } else if (nums[mid] > target) {
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }

  return res;
};

2.2、TypeScript Solution

function searchRange(nums: number[], target: number): number[] {
  let left: number = 0;
  let right: number = nums.length - 1;

  const res: number[] = [-1, -1];

  while (left <= right) {
    let mid: number = Math.floor(left + (right - left) / 2);

    if (nums[mid] === target) {
      let tempMid: number = mid;
      // 一直往左移,找到左端(最开始出现的位置),什么时候停呢,当发现nums[tempMid]不等于target时,
      // 说明刚刚移出到最左端,那么最左端就是当前位置加一
      while (tempMid >= left && nums[tempMid] === target) {
        tempMid--;
      }
      //记录最左端位置
      res[0] = tempMid + 1;

      //把tempMid移回原来的位置
      tempMid = mid;

      while (tempMid <= right && nums[tempMid] === target) {
        tempMid++;
      }
      //记录最右端位置
      res[1] = tempMid - 1;

      //都找到后,退出循环
      break;
    } else if (nums[mid] > target) {
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }

  return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值