5774. 使用服务器处理任务

https://leetcode-cn.com/problems/process-tasks-using-servers/
QQ截图20210530135351.png

  1. /*
  2. 由于在JS中没有自带的优先队列,因此这里手写堆
  3. 堆的起始数组坐标是0
  4. */
  5. class Heap {
  6. /**
  7. * 构造器
  8. * @param {Number} data 数据
  9. * @param {Function} compare 比较函数
  10. */
  11. constructor(data, compare) {
  12. this.data = data;
  13. this.compare = compare;
  14. // 建立堆
  15. for (let i = (data.length >> 1) - 1; i >= 0; i--) {
  16. this.heapify(i);
  17. }
  18. }
  19. /**
  20. * 构建堆
  21. * @param {Number} index 索引
  22. */
  23. heapify(index) {
  24. let target = index;
  25. // 左子树
  26. let left = index * 2 + 1;
  27. // 右子树
  28. let right = index * 2 + 2;
  29. if (left < this.data.length && this.compare(this.data[left], this.data[target])) {
  30. target = left;
  31. }
  32. if (right < this.data.length && this.compare(this.data[right], this.data[target])) {
  33. target = right;
  34. }
  35. if (target !== index) {
  36. this.swap(target, index);
  37. this.heapify(target);
  38. }
  39. }
  40. /**
  41. * 交互函数,交互数组坐标l和r处的元素
  42. * @param {Number} l 左坐标
  43. * @param {Number} r 右坐标
  44. */
  45. swap(l, r) {
  46. let data = this.data;
  47. [data[l], data[r]] = [data[r], data[l]];
  48. }
  49. /**
  50. * 入队
  51. * @param {*} item 放入的值
  52. */
  53. push(item) {
  54. this.data.push(item);
  55. let index = this.data.length - 1;
  56. // 父节点
  57. let father = ((index + 1) >> 1) - 1;
  58. while (father >= 0) {
  59. if (this.compare(this.data[index], this.data[father])) {
  60. this.swap(index, father);
  61. index = father;
  62. father = ((index + 1) >> 1) - 1;
  63. } else {
  64. break;
  65. }
  66. }
  67. }
  68. /**
  69. * 出队
  70. * @returns 出队的值
  71. */
  72. pop() {
  73. this.swap(0, this.data.length - 1);
  74. let ret = this.data.pop();
  75. this.heapify(0);
  76. return ret;
  77. }
  78. }
  79. /**
  80. * @param {number[]} servers 服务权重
  81. * @param {number[]} tasks 任务时间
  82. * @return {number[]}
  83. */
  84. var assignTasks = function (servers, tasks) {
  85. let data = [];
  86. // 根据服务权重和索引存放数据到data中
  87. for (let i = 0; i < servers.length; i++) {
  88. data.push({
  89. prioity: servers[i],
  90. index: i,
  91. });
  92. }
  93. console.log(data);
  94. // 新建heap队列,按照优先级递增的顺序排列
  95. this.heap = new Heap(data, (lower, higher) => {
  96. if (lower.prioity < higher.prioity) {
  97. return true;
  98. } else if (lower.prioity == higher.prioity && lower.index <= higher.index) {
  99. return true;
  100. } else {
  101. return false;
  102. }
  103. });
  104. // 新建idle队列,按照任务时间顺序排列
  105. this.idle = new Heap([], (lower, higher) => {
  106. if (lower.time <= higher.time) {
  107. return true;
  108. } else {
  109. return false;
  110. }
  111. });
  112. console.log(this.heap);
  113. console.log(this.idle);
  114. let ret = [];
  115. let index = 0;
  116. let time = 0;
  117. // 只要任务还有就不停止
  118. while (tasks.length !== 0) {
  119. while (this.idle.data.length && this.idle.data[0].time == time) {
  120. this.heap.push(this.idle.pop().handle);
  121. }
  122. while (this.heap.data.length && index <= time && tasks.length !== 0) {
  123. let tmp = tasks.shift();
  124. let item = this.heap.pop();
  125. this.idle.push({
  126. time: time + tmp,
  127. handle: item,
  128. })
  129. index++;
  130. ret.push(item.index);
  131. }
  132. if (this.heap.data.length) {
  133. time++;
  134. } else {
  135. time = this.idle.data[0].time;
  136. }
  137. }
  138. return ret;
  139. };
  140. let servers = [4,3,2], tasks = [1,2,3,2,1,2];
  141. let res = assignTasks(servers,tasks);
  142. console.log(res);

牛妹的LIS

image.png

  1. class Solution{
  2. public:
  3. int val(string s){
  4. int ans=0;
  5. for(char c:s){
  6. ans=ans*10+c-'0';
  7. }
  8. return ans;
  9. }
  10. int NS_LIS(string n){
  11. int L=(int)n.length();
  12. if(L==1){
  13. return val(n);
  14. }
  15. int ans=0;
  16. int a=n[0]-'0';
  17. ans=max(ans,(a-1)+(L-1)*9);
  18. int s=0;
  19. for(char c:n){
  20. s+=c-'0';
  21. }
  22. ans=max(ans,s);
  23. return ans;
  24. }
  25. };

魔法师牛牛

image.png

bool cmp(pair<int,int> a,pair<int,int> b){
    return a.first<b.first;
}
class Solution{
public:
    vector<int> Magical_NN(vector<int> h){
        int n=(int)h.size();
        vector<pair<int,int>> a(n+1);
        vector<int> pre(n+2,0);
        for(int i=1;i<=n;i++){
            a[i].first=h[i-1];
            a[i].second=i-1;            
        } 
        sort(a.begin()+1,a.end(),cmp);
        for(int i=1;i<=n;i++){
            pre[i]=pre[i-1]+a[i].first;
        }
        vector<int> ans(n);
        for(int i=1;i<=n;i++){
            int Lned=(i-1)*a[i].first-pre[i-1];
            int Rned=(pre[n]-pre[i])-(n-i)*a[i].first;
            ans[a[i].second]=Lned+Rned;
        }
        return ans;
    }
};

149. 直线上最多的点数

QQ截图20210625083233.png

/**
 * @param {number[][]} points
 * @return {number}
 */
var maxPoints = function (points) {
    let n = points.length;
    let ans = 1;
    for (let i = 0; i < n; i++) {
        const map = new Map();
        let maxPointsNum = 0;
        for (let j = i + 1; j < n; j++) {
            const x1 = points[i][0], y1 = points[i][1];
            const x2 = points[j][0], y2 = points[j][1];
            const a = x1 - x2, b = y1 - y2;
            const k = gcd(a, b);
            let key = (a / k) + "_" + (b / k);
            // 对某一点,计算在某条直线上最多的点上数量,保存到maxPointsNum中
            map.set(key, (map.get(key) || 0) + 1);
            maxPointsNum = Math.max(maxPointsNum, map.get(key));
        }
        // 所有点的最大值就是结果
        ans = Math.max(ans, maxPointsNum + 1);
    }
    return ans;

    /**
     * @param {Number} a 
     * @param {Number} b 
     * @returns 最大公约数
     */
    function gcd(a, b) {
        return b === 0 ? a : acd(b, a % b);
    }
};