2014-09-06 37 views
-4

我想知道是否有一個算法/模式,其中有人可以使用例如簡單的循環來獲取/解析給定數組的所有子陣列 。使用單個循環獲取陣列中的所有子陣列

例如:數組myArray{0,1,2,3}我需要

myArray(0,0)myArray(0,1),myArray(0,2),myArray(0,3) 
myArray(1,1)myArray(1,2),myArray(1,3) 
myArray(2,2)myArray(2,3), 
myArray(3,3) 

我不想使用像

for (i = 0; i < myArray.length; i++) { 
    for (j = i; j < myArray.length; j++) 
    { 

    } 
} 

的東西,因爲我想我的算法要快。

+1

語言標記將helpful.Not另一種方法,但我認爲'J = 1'可能需要'J = + 1'。 – 2014-09-06 17:14:41

+3

考慮算法輸出的大小。它是輸入大小的二次方。 – ehudt 2014-09-06 17:15:26

+0

@ehudt好,'n ** 2/2'。儘管如此,嵌套循環可能是實現這一目標的最佳方式。它可以在一個循環中完成,但不會更快。 – yawkat 2014-09-06 17:29:44

回答

1
#include <stdio.h> 

int main() { 
    int myArray[] = {0,1,2,3}; 
    int myArrayLength = sizeof(myArray)/sizeof(*myArray); 
    int i, j; 
    for(j=i=0;i<myArrayLength;++i){ 
     printf("(%d,%d)", myArray[j], myArray[i]); 
     if(i == myArrayLength -1){ 
      i = j++;//++j - 1; 
      printf("\n"); 
     } 
    } 
    return 0; 
} 
+0

正如你舉一個例子,這是打印子數組如:(0,0)(0,1)(0,2)(0, 3) (1,1)(1,2)(1,3) (2,2)(2,3) (3,3) 但有些對如:(1,1),(2, 2),(3,3)不是數組的一部分,因爲沒有兩個二,三和一個。 – 2017-01-17 04:28:12

+0

@ singh.indolia參見OP的例子。包括「(1,1),(2,2),(3,3)」。 – BLUEPIXY 2017-01-17 04:35:53

+0

在你的例子中,這些都包括在內,但在數組中沒有兩個3,2和1. – 2017-01-17 04:38:26

-1

您需要將j的初始化從j = 0修改爲j = i,並遍歷所有可能的對。實施例(JAVA):

public static void main(String[] args) { 
    int[] arr = {1,2,3,4}; 
    List<Integer[]> res = allPairs(arr); 
    for(Integer[] tmp : res) { 
     System.out.println(Arrays.toString(tmp)); 
    } 
} 

private static List<Integer[]> allPairs(int [] myArray) { 
    List<Integer[]> res = new ArrayList<>(); 
    for (int i = 0; i < myArray.length; i++) { 
     for (int j = i; j < myArray.length; j++) { 
      Integer[] tmp = new Integer[2]; 
      tmp[0] = myArray[i]; 
      tmp[1] = myArray[j]; 
      res.add(tmp); 
     } 
    } 
    return res; 
} 

輸出

[1, 1] 
[1, 2] 
[1, 3] 
[1, 4] 
[2, 2] 
[2, 3] 
[2, 4] 
[3, 3] 
[3, 4] 
[4, 4] 
+0

如果downvoters只會關注評論,也許這個答案可能會得到改善... – alfasin 2017-01-17 16:30:54

-1

如果你想所以首先找到一個陣列的所有子陣列,你應該明白的是子陣列數組應該是連續的,但在字符串的情況下不需要連續的,例如:如果我們有一個數組,例如:[1,2,3],在這種情況下,有子數組,如:(1),(2), (3),(1,2),(2,3),(1,2,3)。 程序生成一個數組的子排列:

#include<bits/stdc++.h> 
using namespace std; 

// Prints all subarrays in arr[0..n-1] 
void subArray(int arr[], int n) 
{ 

    for (int i=0; i <n; i++) 
    { 
     for (int j=i; j<n; j++) 
     { 
      for (int k=i; k<=j; k++) 
       cout << arr[k] << " "; 

      cout << endl; 
     } 
    } 
} 

// Driver program 
int main() 
{ 
    int arr[] = {1, 2, 3, 4}; 
    int n = sizeof(arr)/sizeof(arr[0]); 
    cout << "All Non-empty Subarrays\n"; 
    subArray(arr, n); 
    return 0; 
}