【问题标题】:How can I optimize for loop?如何优化 for 循环?
【发布时间】:2022-11-03 23:27:09
【问题描述】:

我想优化这段代码的时间复杂度。 现在,代码具有 O(n^2) 复杂度。如何降低复杂性? 输入是未排序的数组和目标,输出是真或假。

这是我的代码。

// pseudo code in js
function find(arr, target) {
    for(let i = 0; i < arr.length; i++){
        for(let j = i + 1; j < arr.length; j++){
            if(target === (arr[i]+arr[j])){
                return true;
            }
        }
    }
    return false;
}

我认为提示是unsorted 数组。而且我完全不知道..

【问题讨论】:

  • 你的输入/目标是什么样的?将其作为minimal reproducible example/sn-p 添加到您的问题中。
  • arr[i] 的类型是什么?
  • 抱歉,伙计们... arr 的类型是 number[],目标类型是 number

标签: javascript algorithm


【解决方案1】:

我不认为可以简化您的特定实现,但是如果您首先对数组进行排序,则可以采用双指针方法来确定是否可以找到目标,从而导致O(n log n) 复杂性。

function find(arr, target) {
    arr.sort();
    let start = 0;
    let end = arr.length - 1;
    while(start < end) {
        if(arr[start] + arr[end] > target) {
            end--;
        } else if(arr[start] + arr[end] < target) {
            start++;
        } else {
            return true;
        }
    }
    return false;
}

【讨论】:

    【解决方案2】:

    其实你不需要对数组进行排序这需要O(nlogn),但你可以解决它linear runtime O(n+n).

    主意:

    1. 首先从数组中构建一个字典,以便稍后您可以在O(1) 时间搜索一个键。
    2. 然后遍历您的数组并找出提醒是否在字典中,如果找到提醒就是答案。

      例如:arr = [1, 5, 6]target = 6

      所以当你在0th 位置时

      let reminder = target - arr[0];
      let reminder = 6 - 1 = 5
      

      所以你只需要看看你的数组有5与否,这就是为什么你需要建立一个字典来查找O(1)

      const find = (arr, dict, target) => { // then iterating through array which takes O(n)
        let found = false;
        arr.forEach((val) => {
          const reminder = target - val; //just need to find out reminder is already in array or not
          if (reminder in dict) {
            found = true;
            return;
          }
        });
      
        return found;
      }
      
      const arr = [7, 3, 6, 2, 1];
      
      const refDict = arr.reduce((currDict, val) => { //first create a dictionary which takes O(n)
        return {
          ...currDict,
          [val]: true
        };
      }, {});
      
      const isFound = find(arr, refDict, 8);
      console.log(isFound);

      希望能帮助到你!

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 2010-11-15
      • 2011-08-30
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      相关资源
      最近更新 更多