LeetCode 2016. 增量元素之间的最大差值
暴力双重循环
var maximumDifference = function (nums) {let max = -Infinity;for (let i = 0; i < nums.length; i++) {for (let j = i + 1; j < nums.length; j++) {if (nums[j] - nums[i] > max && nums[j] > nums[i]) {max = nums[j] - nums[i];}}}if (max === -Infinity) {return -1;}return max;};
LeetCode 2239. 找到最接近 0 的数字
循环判断绝对值
用两个变量,一个保存原值,一个保存绝对值。nums[0]做初始绝对值,遍历数组对比初始绝对值,小就更新原值和绝对值,相等且原值大于0,就更新原值,原值小于0,不更新,因为要返回满足条件的最大值。
var findClosestNumber = function (nums) {let n = nums[0];let absN = Math.abs(nums[0]);for (let i = 0; i < nums.length; i++) {if (Math.abs(nums[i]) < absN) {n = nums[i]absN = Math.abs(nums[i])} else if (Math.abs(nums[i]) === absN && nums[i] > 0) {n = Math.abs(nums[i]);}}return n;};
LeetCode 1475. 商品折扣后的最终价格
- 双重循环
读懂题,然后双重循环,问题不大
var finalPrices = function (prices) {for (let i = 0; i < prices.length; i++) {for (let j = i + 1; j < prices.length; j++) {if (prices[j] <= prices[i]) {prices[i] = prices[i] - prices[j]break}}}return prices;};
-
LeetCode 2248. 多个数组求交集
hashmap
根据提示是每个数组中的值不会出现重复的,同时要求所有数组都出现过的,因此很简单
首先定义一个hashmap,统计所有数字出现的次数
从中过滤出出现次数符合nums的长度的,证明这些数字每个数组都出现过,否则肯定不够
然后排序返回即可
var intersection = function (nums) {const map = {}//map的键记录数组中的值,map的值记录出现的次数const length = nums.lengthnums.forEach(item => {item.forEach(c => {if (!map[c]) {map[c] = 1} else {map[c]++}})})return Object.entries(map).filter(item => item[1] === length).map(item => item[0]).sort((a, b) => a - b)//先将对象转为二维数组,[["键","值"],["键","值"]]的形式,过滤取掉长度满足nums.length的。//然后把键取出来进行排序,就形成了要返回的一维数组};
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
- 两个二分法分别寻找左右边界,注意,左边界从右侧逼近,有边界从左侧逼近
var searchRange = function (nums, target) {const getLeftBorder = (nums, target) => {let left = 0, right = nums.length - 1let leftBorder = -2while (left <= right) {let middle = left + ((right - left) >> 1)if (nums[middle] >= target) {right = middle - 1leftBorder = right//右侧逼近找左边界,算出来的边界不包含真正的边界,需+1} else {left = middle + 1}}return leftBorder}const getRightBorder = (nums, target) => {let left = 0, right = nums.length - 1let rightBorder = -2while (left <= right) {let middle = left + ((right - left) >> 1)if (nums[middle] > target) {right = middle - 1} else {left = middle + 1rightBorder = left//左侧逼近右边界,算出来的边界不包含真正的边界,需-1}}return rightBorder}let leftBorder = getLeftBorder(nums, target)let rightBorder = getRightBorder(nums, target)if (leftBorder === -2 || rightBorder === -2) return [-1, -1]if (rightBorder - leftBorder > 1) return [leftBorder + 1, rightBorder - 1]return [-1, -1]};
