每日一题

124 阅读1分钟

刷题题库

1 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

如: 输入 7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]], 返回true

思路:
  • 观察: 二维数组,从左到右依次增加,从上到下依次增加,类似矩阵
  • 然后:考虑边界: 当数组不存在或者为空的情况下肯定为false
  • 遍历:在二维中,如果第一个小于目标数,直接返回false,结束当前层循环,如果为相等,返回true
  • 结束后,如果还没return,肯定是没有了,false兜底
function Find(target: any, array: any)
{
  if (array === null || array.length <= 0 || array[0].length <= 0 || array[0][0] > target) return false
  for(let i = 0; i < array.length; i++) {
    if (array[i][0] <= target) {
      for (let j = 0; j < array[0].length; j++) {
        if (target === array[i][j]) {
          return true
        }
      }
    } else {
      return false
    }
  }
  return false
}

最长连续队列(Longest Consecutive Sequence)

如: 输入[100, 4, 200, 1, 3, 2],最长的连续数列是[1, 2, 3,4], 输出他的长度,时间复杂度o(n),结果输出4

思路:
  1. 如果允许O(n log n),可以先排序,但本题要求 O(n)
  2. 由于序列里的元素是无序的,并且要求O(n),因此想到es6新增数据结构Map, 类似于对象,键值对的集合, 所有的数据都是唯一的,不会重复,每条数据都需要放在一个数组中,它本身就是一个构造函数
    • size 数据的长度
    • set() 添加一个数据
    • delete() 删除一条数据
    • get () 获取一条数据
    • has() 查找某条数据,返回一个布尔值
    • clear() 删除所有数据
  3. map中记录每个元素是否被使用,然后针对每个元素,向左以及向右扩张,知道不连续为止,记录下最大长度
const list = [200, 4, 100, 3, 2, 1, 12, 7, 66, 6, 5]
function longestConsecutive(arr) {
    // 最大长度的初始变量
    let longest = 0
    // 边界
    if (!Array.isArray(arr) || !arr.length) return longest
    // 将元素形成哈希表

    let arrMap = new Map()
    for(let key of arr) {
        arrMap.set(key, false)
    }

    for (let i of arr) {
        // 如果数据用过,直接跳过
        if (arrMap.get(i)) continue
        // 将该条数据的使用状态置为true
        arrMap.set(i, true)
        let length = 1
        // 从当前数的右走,直到不连续为止
        for(let j = i+1; arrMap.has(j); j++) {
            arrMap.set(j, true)
            length++
        }
        // 从当前数的左走,直到不连续为止
        for(let j = i -1; arrMap.has(j); j--) {
            arrMap.set(j, true)
            length++
        }
        // 覆盖成最大长度
        longest = Math.max(longest, length)
    }
    return longest

}
longestConsecutive(list)

两数和 Two Sum

  • Input: numbers={2, 7, 11, 15}, target=9
  • Output: index1=1, index2=2
const arr = [2, 7, 3, 6, 11, 15]
function findSumList(arr, sum) {
    if (!Array.isArray(arr) || !arr.length) return null
    let result = []
    let listMap = new Map()
    for(let i of arr) {
        listMap.set(i, i)
    }

    for (let [key, value] of listMap) {
        console.log(key, value)
        const gap = sum - key
        if (listMap.has(gap) && gap > key) {
            result.push([key, gap])
        }

    }

    return result
}
findSumList(arr, 9)