leetcode-contest
2023-04-16
6376. 一最多的行
js
// 2023-04-16: 10:30
/**
* @param {number[][]} mat
* @return {number[]}
*/
var rowAndMaximumOnes = function(mat) {
let max = -1, row = -1;
mat.forEach((r, i) => {
let oneCount = r.filter(x => x === 1).length;
if (oneCount > max) {
max = oneCount;
row = i;
}
})
return [row, max];
};
// mat = [[0,1],[1,0]]
// mat = [[0,0,0],[0,1,1]]
mat = [[0,0],[1,1],[0,0]]
console.log(rowAndMaximumOnes(mat))6350. 找出可整除性得分最大的整数
- https://leetcode.cn/contest/weekly-contest-341/problems/find-the-maximum-divisibility-score/
- 去重,哈希,枚举
js
/**
* @param {number[]} nums
* @param {number[]} divisors
* @return {number}
*/
var maxDivScore = function(nums, divisors) {
let newDivisors = Array.from(new Set(divisors)).sort((a, b) => a - b);
let map = new Map();
for(const d of nums) {
for(const div of newDivisors) {
if (d % div === 0) {
if (map.has(div)) {
map.set(div, map.get(div) + 1);
} else {
map.set(div, 1);
}
}
}
}
// console.log(map, newDivisors)
let res = -1, max = -1;
newDivisors.forEach(d => {
if (map.get(d) > max) {
max = map.get(d);
res = d;
}
});
if(max === -1) return newDivisors[0];
return res
};
// nums = [4,7,9,3,9], divisors = [5,2,3]
// nums = [20,14,21,10], divisors = [5,7,5]
// nums = [12], divisors = [10,16]
nums = [73,13,20,6]
divisors = [56,75,83,26,24,53,56,61]
console.log(maxDivScore(nums, divisors))6375. 构造有效字符串的最少插入数
- https://leetcode.cn/contest/weekly-contest-341/problems/minimum-additions-to-make-valid-string/
- 贪心,递归,枚举情况;(这个非常经典)
js
/**
* @param {string} word
* @return {number}
*/
var addMinimum = function(word) {
// console.log(word)
if(word.length === 0) return 0;
if(word[0] === 'c') return 2+ addMinimum(word.slice(1));
if(word[0] === 'b') {
if(word.length === 1) {
return 2
} else if (word.length > 1) {
if (word[1] === 'c') {
return 1 + addMinimum(word.slice(2))
} else {
return 2 + addMinimum(word.slice(1))
}
}
}
if(word[0] === 'a') {
if(word.length === 1) {
return 2;
}
if(word.length >= 2) {
if(word[1] === 'b') {
if (word.length>=3 && word[2] === 'c') {
return 0 + addMinimum(word.slice(3));
}else {
return 1+ addMinimum(word.slice(2))
}
}else if (word[1] === 'a') {
return 2 + addMinimum(word.slice(1))
} else if (word[1] === 'c') {
return 1 + addMinimum(word.slice(2))
}
}
}
};
// word = 'b'
// word = "aaa"
// word = "abc"
// word = "abca"
word = "aaabca"
// 2 2 2
console.log(addMinimum(word))2022-12-11
- https://leetcode.cn/contest/weekly-contest-323/;
- 20:22 - 21: 10;
6257. 删除每行中的最大值
js
// https://leetcode.cn/contest/weekly-contest-323/
// 20:22 - 21: 10
/**
* @param {number[][]} grid
* @return {number}
*/
var deleteGreatestValue = function(grid) {
let newData = grid.map(items=>[...items].sort((a,b)=>b-a))
// console.log(newData)
if (grid.length ==0 || grid[0].length==0){
return 0
}
let res = 0;
let row = newData.length, col = newData[0].length;
for(let i=0;i<col;i++){
let temp = -1
for(let j=0;j<row;j++){
// console.log(j,i, grid[j][i])
temp = Math.max(temp,newData[j][i])
}
// console.log(temp)
res += temp
}
return res;
};
// grid = [[1,2,4],[3,3,1]]
grid = [[10]]
console.log(deleteGreatestValue(grid))6258. 数组中最长的方波
js
/**
* @param {number[]} nums
* @return {number}
*/
var longestSquareStreak = function(nums) {
let countSet = new Set(nums);
let arr = Array.from(countSet).sort((a,b)=>a-b)
// console.log(arr, countSet)
let res =0
let hasUsed = new Set();
for(const v of arr){
if(!hasUsed.has(v)){
let count = 0
let cur = v
while(!hasUsed.has(cur) && countSet.has(cur)){
// console.log("--",cur)
hasUsed.add(cur);
cur = cur * cur;
count++;
}
res = Math.max(res, count);
}
}
return res>=2? res: -1;
};
// nums = [4,3,6,16,8,2]
nums = [2,3,5,6,7]
console.log(longestSquareStreak(nums))6259. 设计内存分配器
js
/**
* @param {number} n
*/
var Allocator = function(n) {
this.arr = new Array(n).fill(null);
this.edgeMap = new Map();
};
/**
* @param {number} size
* @param {number} mID
* @return {number}
*/
Allocator.prototype.allocate = function(size, mID) {
let left = 0;
let can = false;
while(left< this.arr.length){
let right = left;
while(right<this.arr.length && right<= (left + size - 1) && this.arr[right]=== null){
right++
}
if (right-left === size){
can = true;
break;
}
left = right+ 1
}
if (can) {
for(let i=left;i<left+size;i++){
this.arr[i] = mID
}
let oldEdge = this.edgeMap.get(mID) || [left,left+size-1]
let newEdge = [Math.min(oldEdge[0],left), Math.max(oldEdge[1],left+size-1)]
this.edgeMap.set(mID, newEdge)
return left;
}
return -1
};
/**
* @param {number} mID
* @return {number}
*/
Allocator.prototype.free = function(mID) {
if (!this.edgeMap.has(mID)) {
return 0
}
let count = 0
let edge = this.edgeMap.get(mID)
for(let i=edge[0];i<=edge[1];i++){
if(this.arr[i]=== mID){
this.arr[i] = null
count++
}
}
this.edgeMap.delete(mID)
return count;
};
/**
* Your Allocator object will be instantiated and called as such:
* var obj = new Allocator(n)
* var param_1 = obj.allocate(size,mID)
* var param_2 = obj.free(mID)
*/2022-12-05
6253. 回环句
js
// https://leetcode.cn/contest/weekly-contest-322/
// 12-04-23:36 - 00:31
/**
* @param {string} sentence
* @return {boolean}
*/
var isCircularSentence = function(sentence) {
let arr= sentence.split(/\s+/g)
// console.log(arr)
if(arr[0][0]!=arr[arr.length-1][(arr[arr.length-1].length)-1]){
return false
}
for(let i=0;i<arr.length;i++){
if(i+1<arr.length){
if(arr[i][(arr[i].length)-1]!=arr[i+1][0]){
return false
}
}
}
return true
};
// sentence = "leetcode exercises sound delightful"
sentence = "eetcode"
console.log(isCircularSentence(sentence))6254. 划分技能点相等的团队
js
/**
* @param {number[]} skill
* @return {number}
*/
var dividePlayers = function (skill) {
let sum = skill.reduce((pre, cur) => pre + cur, 0);
let average = sum / (skill.length / 2);
if (sum % (skill.length / 2) != 0) {
return -1;
}
// console.log(sum, average)
let countMap = new Map();
for (const v of skill) {
countMap.set(v, (countMap.get(v) || 0) + 1);
}
// console.log(countMap)
let res = 0;
let hasUsedSet = new Set();
for (const [key, v] of countMap.entries()) {
// console.log(key,v)
if (!hasUsedSet.has(key)) {
if (key * 2 === average) {
if (v % 2 == 0) {
hasUsedSet.add(key);
// console.log(key, v)
res += key * key * (v / 2);
} else {
return -1;
}
continue;
}
if (!hasUsedSet.has(average - key) && countMap.get(average - key) === v) {
// console.log("--1-")
hasUsedSet.add(key).add(average - key);
res += key * (average - key) * v;
} else {
// console.log("-2--", key,v,hasUsedSet.has(average-key),countMap.get(average-key))
return -1;
}
}
}
return res;
};
// skill = [3,2,5,1,3,4]
// skill = [3,4]
// skill = [1,1,2,3]
skill = [2, 2, 2, 2];
console.log(dividePlayers(skill));6255. 两个城市间路径的最小分数
js
/**
* @param {number} n
* @param {number[][]} roads
* @return {number}
*/
var minScore = function (n, roads) {
let pathArr = new Array(n + 1).fill(0)
for (let i = 0; i < pathArr.length; i++) {
pathArr[i] = []
}
for (const [p1, p2, d] of roads) {
// console.log(p1,p2,d)
let arr1 = pathArr[p1];
arr1.push([p2, d])
let arr2 = pathArr[p2];
arr2.push([p1, d])
}
// console.log(pathArr)
let posMinDist = new Map();
for (let i = 1; i <= n; i++) {
let min = Infinity;
for (const [p, d] of pathArr[i]) {
min = Math.min(min, d)
}
posMinDist.set(i, min)
}
// console.log(posMinDist)
let usedSet = new Set();
let sta = [1];
let res = posMinDist.get(1);
while (sta.length > 0) {
let cur = sta.pop();
usedSet.add(cur)
for (const [p] of pathArr[cur]) {
if (!usedSet.has(p)) {
sta.push(p)
usedSet.add(p)
res = Math.min(res, posMinDist.get(p))
}
}
}
return res;
};
// n = 4, roads = [[1,2,9],[2,3,6],[2,4,5],[1,4,7]]
// n = 4, roads = [[1,2,2],[1,3,4],[3,4,7]]
n =
20
roads =
[[18, 20, 9207], [14, 12, 1024], [11, 9, 3056], [8, 19, 416], [3, 18, 5898], [17, 3, 6779], [13, 15, 3539], [15, 11, 1451], [19, 2, 3805], [9, 8, 2238], [1, 16, 618], [16, 14, 55], [17, 7, 6903], [12, 13, 1559], [2, 17, 3693]]
console.log(minScore(n, roads))2022-11-27
- https://leetcode.cn/contest/weekly-contest-321/;
- 2022-11-27-6:46~ 7:12
6245. 找出中枢整数
js
/**
* @param {number} n
* @return {number}
*/
var pivotInteger = function(n) {
const getSum = (start ,end)=>{
return (start + end)/2 * (end - start +1)
}
let left=1; right = n
let mid
while(left<=right){
mid = Math.floor((left+right)/2)
let leftSum = getSum(1, mid);
let rightSum = getSum(mid, n);
// console.log(left, leftSum, right, rightSum, mid)
if(leftSum == rightSum){
return mid
} else if (leftSum < rightSum) {
left = mid +1
}else {
right = mid -1
}
}
return -1
};6246. 追加字符以获得子序列
js
/**
* @param {string} s
* @param {string} t
* @return {number}
*/
var appendCharacters = function(s, t) {
let left = 0;
for(let i=0;i<s.length;i++){
if(left<t.length && s[i]==t[left]){
left++
}
}
return t.length - left
};6247. 从链表中移除节点
js
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var removeNodes = function(head) {
if (!head){
return head
}
let nodeValueList = []
let cur= head;
while(cur){
nodeValueList.push(cur.val)
cur=cur.next
}
// console.log(nodeValueList)
// 从当前索引到结尾的最大值
let maxStack = new Array(nodeValueList.length).fill(-1)
for(let i=maxStack.length-1;i>=0;i--){
if(i===maxStack.length-1){
maxStack[i] = nodeValueList[i]
}else {
maxStack[i] =Math.max(maxStack[i+1], nodeValueList[i])
}
}
// console.log(maxStack)
let numHead = {
val: 0,
next: head,
}
cur = numHead;
let index = 0
while(cur && cur.next){
if(cur.next && cur.next.val === maxStack[index]){
cur=cur.next;
} else {
cur.next = cur.next.next;
}
index++
}
return numHead.next;
};2022-07-17
- https://leetcode.cn/contest/weekly-contest-302/;
- 2022-07-17-3:20- 4.25;
6120. 数组能形成多少数对
js
/**
* @param {number[]} nums
* @return {number[]}
*/
var numberOfPairs = function(nums) {
let map = new Map()
for(const v of nums){
map.set(v,(map.get(v) || 0) + 1)
}
let pairs = 0
let mod = 0
for(const [key, v] of map){
// console.log(key,v)
pairs+= Math.floor(v/2)
mod += v%2
}
return [pairs,mod]
};
// nums = [1,3,2,1,3,2,2]
nums = [0]
// nums = [1,1]
ans = numberOfPairs(nums)
console.log(ans)6164. 数位和相等数对的最大和
js
/**
* @param {number[]} nums
* @return {number}
*/
var maximumSum = function(nums) {
const getBitSum = num=>{
return arr= String(num).split('').reduce((all, cur)=>all+Number(cur), 0)
}
nums.sort((a,b)=>a-b)
let map = new Map()
for(const v of nums){
let cur= getBitSum(v)
let temp = map.get(cur) || []
temp.push(v)
map.set(cur, temp)
}
// console.log(nums, map)
let res = -1
for(const [key, arr] of map){
if(arr.length >=2){
res = Math.max(res, arr[arr.length-1] + arr[arr.length-2])
}
}
return res;
};
// nums = [18,43,36,13,7]
nums = [10,12,19,14]
ans = maximumSum(nums)
console.log(ans)6121. 裁剪数字后查询第 K 小的数字
js
/**
* @param {string[]} nums
* @param {number[][]} queries
* @return {number[]}
*/
var smallestTrimmedNumbers = function(nums, queries) {
const getTrimNum = (str, trimNum) =>{
let len = str.length;
return str.substring(len-trimNum);
}
const getTwoStringBig = (str1, str2)=>{
let len= Math.min(str1.length,str2.length);
for(let i=0;i<len;i++){
let a= Number(str1[i])
let b= Number(str2[i])
if(a!== b){
return a-b
}
}
return 0
}
// console.log(getTrimNum('12345', 2))
let maxLen= nums[0].length;
let dp= new Array(maxLen+1).fill(0)
for(let i=1; i<=maxLen; i++){
let tempArr = nums.map(v=>getTrimNum(v, i))
// console.log(tempArr)
dp[i] = tempArr;
}
// console.log(dp)
let ans = []
let sortArrMap = new Map();
for(const [k, trim] of queries){
let tempArr= null;
if(sortArrMap.has(trim)){
tempArr = sortArrMap.get(trim)
}else{
// console.log('--', dp[trim])
// tempArr = [...dp[trim]].sort((a,b)=>a-b)
tempArr = [...dp[trim]].map((v,index)=>[v,index]).sort((a,b)=>{
if(a[0]!=b[0]){
// console.log(a[0], b[0], getTwoStringBig(a[0], b[0]))
return getTwoStringBig(a[0], b[0])
}else{
return a[1]-b[1]
}
})
sortArrMap.set(trim, tempArr);
}
// console.log(k, trim , tempArr, dp[trim])
let res = tempArr[k-1][1]
ans.push(res)
}
return ans;
};2022-06-12
- https://leetcode.cn/contest/weekly-contest-297;
- 2022-0612-10:30-11:30
5259. 计算应缴税款总额
js
// 20220612-10:30-11:30
/**
* @param {number[][]} brackets
* @param {number} income
* @return {number}
*/
var calculateTax = function(brackets, income) {
let ans=0;
for (let i=0; i<brackets.length; i++){
// console.log(ans,i, brackets[i])
let [upper, rate] = brackets[i];
if(i==0){
let bigger= Math.min(upper,income);
ans+=bigger*rate/100;
// console.log("1",ans)
}else{
let bigger= Math.min(upper,income);
let gap=bigger-brackets[i-1][0]
// console.log("2",gap,rate, gap*rate/100)
ans+=gap*rate/100;
}
if(income<=upper){
break;
}
}
return ans;
};
// let brackets = [[3,50],[7,10],[12,25]], income = 10
// let brackets = [[1,0],[4,25],[5,50]], income = 2
let brackets = [[2,50]], income = 0
let ans=calculateTax(brackets,income)
console.log(ans)5270. 网格中的最小路径代价
js
/**
* @param {number[][]} grid
* @param {number[][]} moveCost
* @return {number}
*/
var minPathCost = function(grid, moveCost) {
let m= grid.length, n= grid[0].length;
let dp= new Array(m).fill(0).map(()=>new Array(n).fill(0));
// console.log(dp)
for(let i=m-1;i>=0;i--){
// i:第几行
if(i==m-1){
for(let index=0;index<n;index++){
dp[i][index]=grid[i][index]
}
// console.log('-1--',dp)
}else{
// index:当前算的第几列
for(let index=0;index<n;index++){
let base=Infinity;
for(let j=0;j<n;j++){
const value=grid[i][index]
let temp=value+moveCost[value][j]+dp[i+1][j]
// console.log("aa",value ,temp)
base=Math.min(base,temp);
}
dp[i][index]=base
}
// console.log('---',dp)
}
}
// console.log(dp)
return Math.min(...dp[0])
};
// let grid = [[5,3],[4,0],[2,1]], moveCost = [[9,8],[1,5],[10,12],[18,6],[2,4],[14,3]]
let grid = [[5,1,2],[4,0,3]], moveCost = [[12,10,15],[20,23,8],[21,7,1],[8,1,13],[9,10,25],[5,3,2]]
let ans= minPathCost(grid,moveCost)
console.log(ans)5289. 公平分发饼干
js
/**
* @param {number[]} cookies
* @param {number} k
* @return {number}
*/
var distributeCookies = function(cookies, k) {
let ans= 0;
let du=Infinity;
let dp=new Array(k).fill(0);
const dfs=(index)=>{
if(index==cookies.length){
let tempArr=[...dp].sort((a,b)=>a-b);
let tempDu=tempArr[tempArr.length-1]-tempArr[0];
// console.log(tempDu,tempArr)
if(tempDu<du){
ans=tempArr[tempArr.length-1];
du=tempDu;
}else if(tempDu==du){
ans=Math.max(ans,tempArr[tempArr.length-1]);
}
return;
}
for(let i=0;i<dp.length;i++){
dp[i]+=cookies[index];
dfs(index+1);
dp[i]-=cookies[index];
}
}
dfs(0);
return ans;
};
// let cookies = [8,15,10,20,8], k = 2
let cookies = [6,1,3,2,2,4,1,2], k = 3
let ans=distributeCookies(cookies,k)
console.log(ans)6094. 公司命名
js
/**
* @param {string[]} ideas
* @return {number}
*/
var distinctNames = function (ideas) {
let allWordsSet = new Set(ideas);
// console.log(allWordsSet)
let ans = 0;
let len = ideas.length;
for (let i = 0; i < len; i++) {
let word1 = ideas[i];
for (let j = 0; j < len; j++) {
if (i == j) {
continue;
}
let word2 = ideas[j];
let newWord1 = word2[0] + word1.substring(1);
let newWord2 = word1[0] + word2.substring(1);
if (!allWordsSet.has(newWord1) && !allWordsSet.has(newWord2)) {
// console.log(newWord1 + "" + newWord2);
ans++;
}
}
}
return ans;
};
// ideas = ["coffee", "donuts", "time", "toffee"];
ideas = ["lack","back"]
let ans = distinctNames(ideas);
console.log(ans);2022-06-11
2299. 强密码检验器 II
js
// 10:34
/**
* @param {string} password
* @return {boolean}
*/
var strongPasswordCheckerII = function(password) {
let res = true;
if(password.length<8){
res = false;
}
if(!/[a-z]/.test(password)){
// console.log(1)
res = false;
}
if(!/[A-Z]/.test(password)){
// console.log(2)
res = false;
}
if(!/[0-9]/.test(password)){
// console.log(3)
res = false;
}
if(!/[\!\@\#\$\%\^\&\*\(\)\-\+]/.test(password)){
// console.log(4)
res = false;
}
if(/([\!\@\#\$\%\^\&\*\(\)\-\+\w])\1/.test(password)){
// console.log(5)
res = false;
}
return res;
};
// let password = "IloveLe3tcode!"
// let password = "ll"
// let password = "IloveLe3tcode!"
let password = "aA0!bB1@@3rbHkB8Puvl"
let ans =strongPasswordCheckerII(password)
console.log(ans)2300. 咒语和药水的成功对数
js
/**
* @param {number[]} spells
* @param {number[]} potions
* @param {number} success
* @return {number[]}
*/
var successfulPairs = function(spells, potions, success) {
const findTarget = (nums, current, target)=>{
let l=0,r=nums.length;
while(l<r){
let mid = Math.floor((l+r)/2);
if(nums[mid]* current<target){
l = mid+1;
}else if(nums[mid]* current>= target){
r=mid;
}
}
return nums.length-r;
}
let map= new Map();
let arr=[...potions].sort((a,b)=>a-b);
let ans= []
for(const v of spells){
if(map.has(v)){
ans.push(map.get(v));
}else{
let temp = findTarget(arr,v,success);
map.set(v,temp);
ans.push(temp);
}
}
return ans;
};
// let spells = [5,1,3], potions = [1,2,3,4,5], success = 7
let spells = [3,1,2], potions = [8,5,8], success = 16
let ans =successfulPairs(spells, potions, success)
console.log(ans)