刷题49(力扣3道题)
84.最小的k个数
题目链接
https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/
题目描述
输入整数数组 arr
,找出其中最小的 k
个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1 输出:[0]
重难点
1. 写sort数值排序
2. 快速排序
题目分析
法一:sort排序
- 写sort数值从小到大排序;
- 根据k输出数组前k个数,就是最小的
k
个数。
/** * @param {number[]} arr * @param {number} k * @return {number[]} */ var getLeastNumbers = function(arr, k) { arr.sort(function(a,b){ return a-b; }); let res = []; for(let i=0;i<k;i++){ res.push(arr[i]); } return res; };
法二:快速排序
/** * @param {number[]} arr * @param {number} k * @return {number[]} */ var getLeastNumbers = function(arr, k) { let len = arr.length; if(!len || !k) return []; let start = 0; let end = len -1; let index = quikSort(arr,start,end); while(index !== k-1){ if(index > k-1){ end = index-1; index = quikSort(arr,start,end); }else{ start = index+1; index = quikSort(arr,start,end); } } return arr.slice(0,index+1); }; function quikSort(arr,left,right){ let flag = arr[left]; while(left < right){ while(left < right && arr[right] >= flag) right--; arr[left] = arr[right]; while(left < right && arr[left] < flag) left++; arr[right] = arr[left]; } arr[left] = flag; return left; }
85.面试题17. 打印从1到最大的n位数
题目链接
https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/
题目描述
输入数字 n
,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1 输出: [1,2,3,4,5,6,7,8,9]
说明:
- 用返回一个整数列表来代替打印
- n 为正整数
重难点
根据n输出最小的n+1位数。
题目分析
- 根据n确定最小的n+1位数:Math.pow(10,n);
- 输出从1到最小的n+1位数(不包括最小的n+1位数),就从 1 到最大的 n 位数。
/** * @param {number} n * @return {number[]} */ var printNumbers = function(n) { let len = Math.pow(10,n); let res = []; for(let i=1;i<len;i++){ res.push(i); } return res; };
86.面试题 04.02. 最小高度树
题目链接
https://leetcode-cn.com/problems/minimum-height-tree-lcci/
题目描述
给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
重难点
二叉搜索树:左子树所有节点的值小于根节点,右子树所有节点的值大于根节点,且左、右子树均为二叉搜索树。
大于根节点。
题目分析
- 如果数组为空,返回null;
- 由于数组是有序数组,找到数组索引1/2的位置,就是数组中间值,即为根节点;
- 以数组中间值为根节点建立二叉树;
- 左子树的值是小于中间值的数;
- 右子树的值是大于中间值的数;
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {number[]} nums * @return {TreeNode} */ var sortedArrayToBST = function(nums) { let len = nums.length; if(len === 0){ return null; } let mid = parseInt(len/2); let root = new TreeNode(nums[mid]); root.left = sortedArrayToBST(nums.slice(0, mid)); root.right =sortedArrayToBST(nums.slice(mid+1)); return root; };