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
思路:
- 如果允许O(n log n),可以先排序,但本题要求 O(n)
- 由于序列里的元素是无序的,并且要求O(n),因此想到es6新增数据结构
Map, 类似于对象,键值对的集合, 所有的数据都是唯一的,不会重复,每条数据都需要放在一个数组中,它本身就是一个构造函数- size 数据的长度
- set() 添加一个数据
- delete() 删除一条数据
- get () 获取一条数据
- has() 查找某条数据,返回一个布尔值
- clear() 删除所有数据
- 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)