leetCode经典算法150题---解答

82 阅读2分钟

LCR 016. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
  let arr = []
  let str = []
  for (let i = 0; i < s.length; i++) {
    if (str.includes(s[i])) {
      arr.push(str.length)
      str = []
    } else {
      str.push(s[i])
    }
  }
  let len=Math.max.apply(null, arr)
  return len
}

88. 合并两个有序数组

 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function (nums1, m, nums2, n) {
  for (let i = 0; i < n; i++) {
    nums1[m + i] = nums2[i]
  }
  nums1.sort((a, b) =>(a - b)) // 按照升序排序

}

27. 移除元素

 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function (nums, val) {
  let i = 0
  while (i < nums.length) {
    if (nums[i] === val) {
      nums.splice(i, 1)
    }else{
        i++
    }
    
  }
  return nums.length
}

26. 删除有序数组中的重复项

 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
//   for (let i = 0; i < nums.length; i++) {
//     if (i > 0 && nums[i] === nums[i - 1]) {
//       nums.splice(i, 1)
//       i--
//     }
//   }
let i = 0
  while (i < nums.length) {
    if (i > 0 && nums[i] === nums[i - 1]) {
      nums.splice(i, 1)
    } else {
      i++
    }
  }
  return nums.length
}

80. 删除有序数组中的重复项 II

 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
  let i = 0
  while (i < nums.length) {
    if (nums[i] === nums[i - 1] && nums[i - 1] === nums[i - 2]) {
      nums.splice(i, 1)
    } else {
      i++
    }
  }
  return nums.length
}

169. 多数元素

 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function (nums) {
  if (nums.length === 1) {
    return nums[0]
  } else {
    let obj = {}
    let keysArr = []
    let valueArr = []
    let maxNumIndex = 0
    nums.forEach((element) => {
      if (obj[element]) {
        obj[element]++
      } else {
        obj[element] = 1
      }
    })
    keysArr = Object.keys(obj)
    valueArr = Object.values(obj)
    maxNumIndex = valueArr.indexOf(Math.max.apply(null, valueArr))
    return keysArr[maxNumIndex]
  }
}

189. 轮转数组

 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function (nums, k) {
  if (nums.length === 1) return
  let len = 0
  k > nums.length ? (len = k % nums.length) : (len = k)

  let spliArr = nums.splice(-len).reverse()
  for (let index = 0; index < spliArr.length; index++) {
    nums.unshift(spliArr[index])
  }
}

121. 买卖股票的最佳时机

 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function (prices) {
    let maxPrice = 0
    let min = 9999999
    let len = 0
    for (let i = 1; i < prices.length; i++) {
      min = min < prices[i - 1] ? min : prices[i - 1]
      if (prices[i] > min) {
        len = prices[i] - min
        maxPrice = maxPrice > len ? maxPrice : len
      }
    }
    return maxPrice
  }
  

55. 跳跃游戏

 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function (nums) {
  let n = nums.length
  let rm = 0
  for (let i = 0; i < n; i++) {
    if (i <= rm) {
      rm = Math.max(rm, i + nums[i])
      if (rm >= n - 1) {
        return true
      }
    }
  }
  return false
}

45. 跳跃游戏 II

 * @param {number[]} nums
 * @return {boolean}
 */
var jump = function (nums) {
   let cur =0
   let next =0
   let count =0
   for (let i = 0; i < nums.length-1; i++) {
    next=Math.max(nums[i]+i,next)
    if(i===cur){
        cur=next
        count++
    }
   }
   return count
}

未完待续。。。。。