Open Checkson opened 5 years ago
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例1:
输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 1
示例2:
输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1 输出: 3
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?
解法一(深度优先搜索 + 中序遍历)
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @param {number} k * @return {number} */ var kthSmallest = function(root, k) { var arr = [], st = [], p = root; while (p != null || st.length != 0) { while(p != null){ st.push(p); p = p.left; } p = st.pop(); arr.push(p.val); p = p.right; } return arr[k - 1]; };
解法二(递归)
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @param {number} k * @return {number} */ var kthSmallest = function(root, k) { var list = []; order(root,list); return list[k-1]; }; function order (root, list) { if (!root) { return; } order(root.left, list); list.push(root.val); order(root.right, list); }
解析:
无论是递归方法还是非递归方法,其基本思路都是通过中序遍历搜索二叉树后,得到了从小到大的序列,然后直接取出下标为 k - 1 的元素。
k - 1
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
输入: num1 = "2", num2 = "3" 输出: "6"
输入: num1 = "123", num2 = "456" 输出: "56088"
题解:
/** * @param {string} num1 * @param {string} num2 * @return {string} */ var multiply = function(num1, num2) { var arr1 = num1.split('').reverse(), arr2 = num2.split('').reverse(); var res = [], tmp = 0; for (var i = 0, len1 = arr1.length; i < len1; i++) { for (var j = 0, len2 = arr2.length; j < len2; j++) { var a = parseInt(arr1[i]), b = parseInt(arr2[j]), multi = a * b, val = parseInt(res[i + j] || 0); val += (multi + tmp); if (typeof res[i + j] === 'undefined') { res.push(val % 10 + ''); } else { res[i + j] = (val % 10 + ''); } tmp = parseInt(val / 10); } if (tmp) { res.push(tmp + ''); tmp = 0; } } // 去除多余的0 var isValid = true; for (var i = res.length - 1; i >= 0; i--) { if (i === 0) { continue; } else if (res[i] === '0' && isValid) { res.splice(i, 1); } else if (res[i] !== '0') { isValid = false; } } return res.reverse().join(''); };
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var addTwoNumbers = function(l1, l2) { if (!l1) return l2; if (!l2) return l1; var ans = null, trail = null, node = null, tmp = 0; while (l1 != null || l2 != null) { var val = tmp; if (l1 != null) { val += l1.val; l1 = l1.next; } if (l2 != null) { val += l2.val; l2 = l2.next; } var node = new ListNode(val % 10); tmp = parseInt(val / 10); if (ans) { trail.next = node; trail = node; } else { ans = node; trail = node; } } if (tmp) { node = new ListNode(tmp); trail.next = node; } return ans; };
230. 二叉搜索树中第K小的元素
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例1:
示例2:
进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?
解法一(深度优先搜索 + 中序遍历)
解法二(递归)
解析:
无论是递归方法还是非递归方法,其基本思路都是通过中序遍历搜索二叉树后,得到了从小到大的序列,然后直接取出下标为
k - 1
的元素。43. 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例1:
示例2:
说明:
题解:
2. 两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
题解: