返回

算法训练篇:数组中两个元素的最小距离

人工智能

引言

在算法的世界中,数组是一个常见的结构,它存储着相同数据类型的元素集合。当处理数组时,一个常见的任务是找到两个元素之间的最小距离。例如,在给定数组 [1, 2, 3, 4, 2, 3, 2, 2] 中,找到两个 "2" 元素之间的最小距离。

暴力循环法

一种解决这个问题的简单方法是使用暴力循环法。它涉及对数组进行双重遍历:

for (int i = 0; i < n; i++) {
  // 找到第一个元素
  if (arr[i] == num1) {
    for (int j = i + 1; j < n; j++) {
      // 找到第二个元素
      if (arr[j] == num2) {
        // 计算并记录当前距离
        int distance = j - i;
        if (distance < min_distance) {
          min_distance = distance;
        }
      }
    }
  }
}

在上面的代码中,n 是数组的长度,num1num2 是要查找的两个元素。

时间复杂度

暴力循环法的時間复杂度為O(n^2),其中n為數組的大小。這是因為內層迴圈會隨著外層迴圈的每次迭代而執行。

優化方法

為了優化暴力循環法,我們可以將兩個元素儲存在一個雜湊表中,其中鍵是元素的值,值是元素的索引。這樣,我們就不需要在內層迴圈中重複搜索第二個元素了。

// 使用哈希表來儲存元素的索引
HashMap<Integer, Integer> indexMap = new HashMap<>();

for (int i = 0; i < n; i++) {
  // 更新元素的索引
  indexMap.put(arr[i], i);
}

for (int i = 0; i < n; i++) {
  // 找到第一個元素
  if (arr[i] == num1) {
    // 檢查哈希表中是否存在第二個元素
    Integer index2 = indexMap.get(num2);
    if (index2 != null && index2 > i) {
      // 計算並記錄當前距離
      int distance = index2 - i;
      if (distance < min_distance) {
        min_distance = distance;
      }
    }
  }
}

時間複雜度

使用哈希表的優化方法的時間複雜度為O(n),因為我們只需遍歷數組一次並檢查哈希表。

結論

找到兩個元素之間的最小距離是一個常見的算法問題。暴力循環法是一個簡單的方法,但時間複雜度很高。通過使用哈希表,我們可以優化該方法,將時間複雜度降低到 O(n)。