如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的
题号:75
//map统计各个数字出现频率,然后在原数组上从新赋值
var sortColors = function (nums) {
let map = new Map()
nums.forEach((item) => {
if (map.has(item)) {
let num = map.get(item)
num++
map.set(item,num)
} else {
map.set(item,1)
}
});
let begin = 0
if (map.has(0)) {
let num0 = map.get(0)
nums.fill(0, begin, begin + num0)
begin = begin + num0
}
if (map.has(1)) {
let num1 = map.get(1)
nums.fill(1, begin, begin + num1)
begin = begin + num1
}
if (map.has(2)) {
let num2 = map.get(2)
nums.fill(2, begin, begin + num2)
begin = begin + num2
}
return nums
};
//多次扫描
var sortColors = function (nums) {
let begin = 0
for (let i = begin; i < nums.length; i++) {
if (nums[i] == 0) {
//交换
let tmp = nums[begin]
nums[begin] = nums[i]
nums[i] = tmp
begin ++
}
}
for (let i = begin; i < nums.length; i++) {
if (nums[i] == 1) {
//交换
let tmp = nums[begin]
nums[begin] = nums[i]
nums[i] = tmp
begin ++
}
}
return nums
};
//实现快排
var sortColors = function (nums) {
qSort(nums,0,nums.length - 1)
return nums
};
function qSort(nums, left, right) {
//保存初始要排序的数组端的边界
let i = left
let j = right
if (i > j) {
return
}
let pivot = nums[i]//选择基准点
while (left < right) {
//从右边找小于基准点的值
while (nums[right] >= pivot && left < right) {
right --
}
while (nums[left] <= pivot && left < right) {
left ++
}
if (left < right) {
//交换
let tmp = nums[right]
nums[right] = nums[left]
nums[left] = tmp
}
}
//把基准值放到我们寻找的位置
nums[i] = nums[left]
nums[left] = pivot
qSort(nums, i, left - 1)
qSort(nums,left + 1,j)
}
题号:98
//中序遍历
//一开始是中序遍历这个树把结果放入数组,再遍历数组是否递增
//浪费空间
//下面中序遍历的顺序继续前一个值,遍历的过程就把排序的正确
//与否给计算出来了
var isValidBST = function (root) {
let preVal = Number.MIN_SAFE_INTEGER
let helper = (node) => {
if (node == null) {
return true
}
if (!helper(node.left)) {
return false
}
if (node.val <= preVal) {
return false
}
preVal = node.val
return helper(node.right)
}
return helper(root)
}
题号:152
//动态规划多表
var maxProduct = function (nums) {
let minTable = new Array(nums.length)
let maxTable = new Array(nums.length)
for (let i = 0; i < nums.length; i++) {
if (i == 0) {
minTable[i] = nums[i]
maxTable[i] = nums[i]
} else {
minTable[i] = Math.min(nums[i], minTable[i-1] * nums[i], maxTable[i-1] * nums[i])
maxTable[i] = Math.max(nums[i],minTable[i-1]*nums[i],maxTable[i-1]*nums[i])
}
}
let result = Number.MIN_SAFE_INTEGER
maxTable.forEach((item) => {
result = Math.max(result,item)
});
return result
};