【问题标题】:How to traverse an array from both the sides at the same time?如何同时从两边遍历一个数组?
【发布时间】:2020-01-21 07:49:37
【问题描述】:

我正在寻找一种技术,我们可以同时从两侧遍历数组,同时保持 O(n) 的时间复杂度。是否可以?如果是,那么究竟如何? 我使用的是 Java,但您可以提供任何语言的解决方案。

【问题讨论】:

  • ptr1 = 0, ptr2 = arr.length-1; 所以在你的 while 循环中,ptr1++,ptr2-- 还是我误解了你的问题?
  • 到目前为止您尝试过什么?您可以迭代它,使用 i(循环的)作为第一个元素的索引,使用 (length() - 1) - i 作为第二个元素的索引
  • @vivek_23 不需要第二个变量 :)
  • @Stultuske 是的,是的 :)
  • "我们可以同时从两侧遍历数组,同时保持 O(n) 的时间复杂度" )。如果您将数组从一端遍历到另一端并再次回到起点,则为 O(n)。如果你遍历第一个,最后一个,第二个,倒数第二个......它是O(n)。如果您最多访问数组中的每个元素 k 次(对于某个常数 k),则为 O(n)。

标签: java arrays algorithm


【解决方案1】:
 int[] arr = new int[20];
 int i=0;
 int j=arr.length-1;

 while(j>i){
   System.out.println(arr[i]);
   System.out.println(arr[j]);
   i++;
   j--;
 }

这是另一种使用 for 循环的方法,例如

int[] arr = new int[20];
for (int i = 0; i < (arr.length / 2); i++) {
  System.out.println(arr[i]);
  System.out.println(arr[arr.length -1 - i]);
}

【讨论】:

    【解决方案2】:

    不要尝试这样做,因为,当您有一个包含 100 个元素的数组时,您如何获得数组的元素大小array.leneth()function 将尝试进行增量计数直到结束)

    含义 - 你有一个数组会有 10 个元素 (1,2,3,4,5,6,7,8,9,10) ,你如何遍历,来自1 to 1010 to 1

    步骤 1. 遍历1-10 你必须逐个元素地遍历直到结束

    步骤 2. 遍历 10-1 你必须知道完整数组的长度 - 长度的意思是你必须再次遍历 1-10 直到结束 - 当你考虑反向遍历时,它应该减少一些东西

    1-1010-1的复杂度是多少

    第 1 步复杂度为 o(n) 第 2 步的复杂性首先你必须遍历以获得数组的长度,它将是 o(n) 并且你必须再次遍历反向然后它将 o(n)

    脑震荡——会浪费不必要的时间

    【讨论】:

      【解决方案3】:

      我尝试过使用简单的 for 循环。

       var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
          
          for (var i = 0, j = arr.length - 1; i <= j; i++, j--) {
            console.log(arr[i] + ' , ' + arr[j]);
          }
      
       Output : 
             1 , 10
             2 , 9
             3 , 8
             4 , 7
             5 , 6
      

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 2021-10-15
        • 1970-01-01
        • 2010-10-04
        • 2011-02-12
        • 1970-01-01
        • 2022-08-30
        • 2022-08-30
        • 2011-08-03
        相关资源
        最近更新 更多