第一题:环和杆
题目描述
思路
存储每个位置出现的颜色值的集合,统计集合的大小等于3的位置个数,返回即可。
代码
var countPoints = function(rings) {let len =rings.length;let dp =new Array(10).fill(0).map(v=>new Set());// 表示第i个位置上集齐的颜色for(let i =0 ;i < len;i += 2){dp[+rings[i+1]].add(rings[i]);}let res=0;for(let i =0 ;i < 10;i++){if(dp[i].size == 3)res++;}return res;};
第二题:子数组的范围和
描述
思路
遍历每个区间,求出最大值和最小值,然后累加最大值和最小值的差值,最后返回累加结果。
使用双重循环遍历区间,其中外循环遍历i作为区间的开始位置,内循环遍历j作为区间的结束位置。
遍历过程中满足dp[i,j] = max(max[i, j-1], nuns[j] ); 其中dp[i,j]表示区间[i,j]中的最大值。
区间最小值同理。
代码
var subArrayRanges = function(nums) {const n =nums.length;let sum = 0;let min,max;for(let i =0 ;i < n;i++){min = nums[i];max = nums[i];for(let j = i + 1 ;j < n; j++){min = nums[j] < min? nums[j]:min;max = nums[j] > max? nums[j]:max;sum += max - min;}}return sum;};
第三题:给植物浇水 II
描述
思路
代码
var minimumRefill = function(plants, capacityA, capacityB) {const n=plants.length;let l=0, r = n-1;let a = capacityA, b = capacityB;let cnt=0;while(l < r){if(a >= plants[l]){a -= plants[l];}else{a = capacityA - plants[l];cnt++;}l++;if(b >= plants[r]){b -= plants[r];}else{b = capacityB - plants[r];cnt++;}r--;}if(l == r && ( a >= plants[l] || b >= plants[l]))return cnt;else if(l == r)return cnt+1;return cnt;};
第四题:摘水果
描述
思路
先求出 前缀和,然后遍历可行的区间,得出各个可行区间和,得出最大的区间和即可。
注意: 只要是区间和问题,一律先求出前缀和
代码
var maxTotalFruits = function(fs, start, k) { // 只要是区间和,就一定要求 前缀和const n = fs.length;const pre = []; //求出前缀和 ,const pos = fs[n-1][0];for(let i = 0, j=0; i <= pos; i++){if( i==0 && fs[j][0]==0 ){pre[0] = fs[j++][1];}else if(i == 0){pre[0] = 0;}else if(fs[j][0] == i){pre[i] = pre[i-1] + fs[j][1];j++;}else{pre[i] = pre[i-1];}}if(k == 0){if(start > pos) return 0;if(start == 0) return pre[0];return pre[start] - pre[start-1];}let res = Math.max(get(k, 0), get(0,k));for(let i= k ; i > 0; i--){let left = get( i, k - 2*i);let right = get(k-2*i, i);res=_.max([res,left,right]);}return res;function get( l, r){ // 返回区间l 到 r之间的区间和if(r < 0) r = 0;if(l < 0) l = 0;if(start - l - 1 < 0 && start + r > pos){return pre[pos];}else if(start-l-1 < 0){return pre[start+r]}else if(start+r > pos) {return pre[pos] - pre[start-l-1];}return pre[start+r] - pre[start-l-1];}};
