
数据结构
tinyint_813
这个作者很懒,什么都没留下…
展开
-
蛇形打印二叉树
采用层序遍历的方式。虽然leetcode有点问题,但结果没错的var levelOrder = function(root) { if(!root) return null; let res = []; let flag = 1; let queue = []; queue.push(root); while(queue.length > 0){ let temp = []; let tempQ = [];原创 2021-08-03 17:08:12 · 295 阅读 · 0 评论 -
统计一个元素出现的次数(通过循环arr.index(值)不为-1就增加计数器,并用splice删除节点)
/*统计一个数字在排序数组中出现的次数*/// indexOf():可返回某个指定的字符串值在字符串中首次出现的位置,没有出现则返回-1// splice():向从数组中添加/删除项目,然后返回被删除的项目。// .splice(index,howmany,item1..itemn):index代表索引,howmany代表删除几个数字,若为0则是插入。item代表插入的值var findNums = function (nums, target){ res = 0; while (n原创 2021-06-21 20:46:20 · 130 阅读 · 0 评论 -
找出数组中超过一半的数字(遍历整个数组, 利用map存储对应的节点和次数,用has, get, set更新节点的次数;遍历完后根据get到的值是否大于len/2来得到元素)
var majorityElement = function(nums) { let len = nums.length; let res = new Map(); for(let i = 0; i < len; i++){ if(res.has(nums[i])){ res.set(nums[i], res.get(nums[i])+1); }else{ res.set(nums[i], 1);原创 2021-06-21 20:42:59 · 116 阅读 · 0 评论 -
找出数组中的重复数字(利用set,先用size得到set的大小,再用add添加数,判断当前set的size是否增加,增加了代表是重复数值,就输出)
// 找出数组中重复的数字// 输入:[2, 3, 1, 0, 2, 5, 3]// 输出:2 或 3// nums用来表示待查询的数组// Set()是重复有序的,利用这一点,若Set没有增加长度,则代表有重复的值出现var findRepeatNumber = function (nums){ let s = new Set(); for(var i in nums){ var curLength = s.size; s.add(nums[i]原创 2021-06-21 20:40:07 · 220 阅读 · 0 评论 -
二维数组查找值
/*在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。*/// flat() : 数组扁平化,实现降维;// arr3.flat(Infinity);: 使用 Infinity 作为深度,展开任意深度的嵌套数组// includes() 方法用于判断字符串是否包含指定的子字符串。如果找到匹配的字符串则返回 true,否则返回 false。includes()原创 2021-06-21 20:37:46 · 171 阅读 · 0 评论 -
0-n之间的缺失数字(由于是有序的0-n-1的数值,所以使用二分查找,判断当前数值是否和索引一样,不然就继续循环)
/*一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。 在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。*/// Math.floor(x):对一个数向下取整// 二分查找法var findmissingNumber = function (nums){ let len = nums.length; // 判断是否是第一个或最后一个缺失 if (nums[0] != 0){ return原创 2021-06-21 20:33:44 · 226 阅读 · 0 评论 -
求连续子数组的最大和(从第二个点开始记录每个值加上前面的值是正影响还是负影响,负影响就加0,正影响就加值)
/*输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n) *//*动态规划时间复杂度 O(N):线性遍历数组 nums 即可获得结果,使用 O(N) 时间。空间复杂度 O(1):使用常数大小的额外空间。 *//*算法步骤:①状态定义: 设动态规划列表 dp,dp[i] 代表以元素 nums[i] 为结尾的连续子数组最大和。(为了保证连续子数组)②转移方程: 若 dp[i - 1] ≤ 0 ,说明 dp[i - 1] 对 d原创 2021-06-21 20:15:29 · 99 阅读 · 0 评论 -
剪绳子------JS(核心:2*2比3*1大)
/*给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 *//*解题思路:设将长度为 n 的绳子切为 m 段:本题等价于求解: max(k[0]*k[1]*...*k[m-1]),其中 n = k[0]+k[1]+..原创 2021-06-21 20:03:41 · 169 阅读 · 0 评论 -
斐波那契数列三种方法
/* 方法一:递归 */// function fn1(n){// if (n<=2){// return 1;// }// return fn1(n-1)+ fn1(n-2);// }// console.log(fn1(6));// 方法二:迭代// function fb(n){// let a = 0, b = 1, sum;// for (let i = 0; i < n; i++){//原创 2021-06-21 20:00:43 · 115 阅读 · 0 评论 -
冒泡排序最好情况为什么是O(N)?
function bubbleSort(nums){ let len = nums.length; let flag = true; for (let i = 0; i < len && flag; i++) { flag = false; for (let j = 0; j < len - i - 1; j++){ if (nums[j] > nums[j+1]){原创 2021-06-17 23:06:34 · 662 阅读 · 0 评论 -
算法——简单选择排序
function selectSort(nums){ let len = nums.length; let min,temp; for (let i=0;i<len-1;i++){ let k=i; for (let j=i+1;j<len;j++){ if (nums[k]>nums[j]){ k=j; } } min =原创 2021-06-12 17:29:42 · 119 阅读 · 0 评论 -
算法——直接插入排序
// 从头开始,保持一个有序排列,如果找到了比后面大的,比前面小的,就停止这一层循环function insertSort(nums){ let len = nums.length; if (len<2){ return nums; } for (let i = 0; i < len; i++){ for (let j = i+1; j>-1&& nums[j]>nums[j+1]; j--){原创 2021-06-12 17:29:04 · 101 阅读 · 0 评论 -
算法——快速排序
var test=[5,7,2,9,3,8,4,7,1];// 每次选择最左边的数作为基数// var quickSort = function (arr){// if (arr.length < 2) {return arr;}// let left = 0;// let right = arr.length - 1;// while (left < right){// while (arr[right]>=arr[0] &原创 2021-06-12 17:28:33 · 102 阅读 · 0 评论 -
算法——冒泡排序
// function bubbleSort(nums){// let len = nums.length;// let flag = true;// for (let i=0;i<len&&flag; i++){// flag = false;// for (let j=0;j<len-i-1; j++){// if (nums[j]>nums[j+1]){//原创 2021-06-12 17:27:36 · 101 阅读 · 0 评论 -
树 —— 深度优先遍历
数据结构:栈使用递归:判断传入的节点是否为空,为空就return,根据遍历顺序丢给调用函数,再把当前的值赋给res数组// 前序遍历// var preOrder = function (root){// let res = []// let stack = []// root && stack.push(root)// while (stack.length>0){// let temp = stack.pop()//原创 2021-06-12 17:26:44 · 277 阅读 · 0 评论 -
树 —— 广度优先遍历
数据结构:队列核心:只要queue中有节点,就删除queue中的第一个节点,把节点值赋值给res,并判断这个节点是否有左右节点,有就依次放入queue中。循环直至queue中没值。var levelOrder = function (root){ let res = [] let queue = [] root && queue.push(root) while (queue.length>0){ let temp = queue.s原创 2021-06-12 17:25:27 · 101 阅读 · 0 评论