第一章 数组
文章目录
前言
以下解答非最优解
一、简单集合
重塑矩阵
题目
输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]
链接: 重塑矩阵
解答
/**
* @param {number[][]} mat
* @param {number} r
* @param {number} c
* @return {number[][]}
*/
var matrixReshape = function(mat, r, c) {
let m = mat.length
let n = mat[0].length
if(r*c != m*n){
return mat
}
var res = new Array(r).fill(0).map(()=>new Array(c).fill(0));
for(let i =0;i<m*n;i++){
res[Math.floor(i/c)][i%c] = mat[Math.floor(i/n)][i%n]
}
return res;
};
分糖果
题目
输入:candyType = [1,1,2,2,3,3]
输出:3
解释:Alice 只能吃 6 / 2 = 3 枚糖,由于只有 3 种糖,她可以每种吃一枚。
链接: 分糖果
解答
/**
* @param {number[]} candyType
* @return {number}
*/
var distributeCandies = function(candyType) {
let setArr = new Set(candyType)
return Math.min(setArr.size,candyType.length/2);
};
最长和谐子序列
题目
输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]
链接: 最长和谐子序列
解答
/**
* @param {number[]} nums
* @return {number}
*/
var findLHS = function(nums) {
let con = new Map();
for(let i=0;i<nums.length;i++){
con.set(nums[i],(con.get(nums[i]) || 0) + 1)
}
let number = 0
for(let num of con){
let val = con.get(num[0]+1)?num[1] + con.get(num[0]+1):(con.get(num[0]-1)?num[1] + con.get(num[0]-1):0)
if(number < val){
number = val
}
}
return number
};
范围求和 II
题目
输入: m = 3, n = 3,ops = [[2,2],[3,3]]
输出: 4
解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。
链接: 范围求和 II
解答
/**
* @param {number} m
* @param {number} n
* @param {number[][]} ops
* @return {number}
*/
var maxCount = function (m, n, ops) {
let mina = m;
let minb = n;
for (let i = 0; i < ops.length; i++) {
mina = Math.min(mina, ops[i][0])
minb = Math.min(minb, ops[i][1])
}
return mina * minb;
};
两个列表的最小索引总和
题目
输入: list1 = [“Shogun”, “Tapioca Express”, “Burger King”, “KFC”],list2 = [“Piatti”, “The Grill at Torrey Pines”, “Hungry Hunter Steakhouse”, “Shogun”]
输出: [“Shogun”]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。
链接: 两个列表的最小索引总和
解答
/**
* @param {string[]} list1
* @param {string[]} list2
* @return {string[]}
*/
var findRestaurant = function (list1, list2) {
let obj = {}
let num = list2.length + list1.length
let arr = []
for (let i = 0; i < list1.length; i++) {
obj[list1[i]] = i
}
for (let i = 0; i < list2.length; i++) {
if (obj[list2[i]] !== undefined) {
let total = obj[list2[i]] + i
if (total < num) {
num = total
arr = [list2[i]]
} else if (total == num) {
arr.push(list2[i])
}
}
}
return arr
};
种花问题
题目
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true
链接: 种花问题
解答
/**
* @param {number[]} flowerbed
* @param {number} n
* @return {boolean}
*/
var canPlaceFlowers = function (flowerbed, n) {
for (let i = 0; i < flowerbed.length; i++) {
let last = i + 1 >= flowerbed.length ? flowerbed.length - 1 : i + 1
let pre = i - 1 <= 0 ? 0 : i - 1
if (flowerbed[i] == 0 && flowerbed[pre] == 0 && flowerbed[last] == 0) {
if (n) {
n = n - 1
flowerbed.splice(i, 1, 1)
}
}
}
if (n == 0) {
return true
}
return false
};
三个数的最大乘积
题目
输入:nums = [1,2,3]
输出:6
链接: 三个数的最大乘积
解答
/**
* @param {number[]} nums
* @return {number}
*/
var maximumProduct = function(nums) {
// 最小的和第二小的
let min1 = Number.MAX_SAFE_INTEGER, min2 = Number.MAX_SAFE_INTEGER;
// 最大的、第二大的和第三大的
let max1 = -Number.MAX_SAFE_INTEGER, max2 = -Number.MAX_SAFE_INTEGER, max3 = -Number.MAX_SAFE_INTEGER;
for (const x of nums) {
if (x < min1) {
min2 = min1;
min1 = x;
} else if (x < min2) {
min2 = x;
}
if (x > max1) {
max3 = max2;
max2 = max1;
max1 = x;
} else if (x > max2) {
max3 = max2;
max2 = x;
} else if (x > max3) {
max3 = x;
}
}
return Math.max(min1 * min2 * max1, max1 * max2 * max3);
};
子数组最大平均数 I
题目
输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
链接: 子数组最大平均数 I
解答
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findMaxAverage = function (nums, k) {
let num = 0
for (let i = 0; i < k; i++) {
num += nums[i]
}
let total = num
for (let i = k; i < nums.length; i++) {
num = num - nums[i - k] + nums[i]
total = Math.max(num, total)
}
return total / k
};