Java 使用单个循环从阵列获取所有子阵列
我想知道是否有一种算法/模式可以让人获取/解析给定数组的所有子数组 例如,使用一个简单的循环 例如:对于数组myArray{0,1,2,3},我需要Java 使用单个循环从阵列获取所有子阵列,java,c#,c++,c,arrays,Java,C#,C++,C,Arrays,我想知道是否有一种算法/模式可以让人获取/解析给定数组的所有子数组 例如,使用一个简单的循环 例如:对于数组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;
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++)
{
}
}
因为我希望我的算法更快 您需要将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,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;
}
语言标记会有帮助。不是一种替代方法,但是我认为j=1可能需要j=i+1。考虑算法输出的大小。输入的大小是二次的。@ehudt-well,n**2/2。不过,嵌套循环可能是实现这一点的最佳方式。它可以在一个循环中完成,但不会更快。正如你给出的一个例子,这是打印子数组,如:0,00,10,20,3 1,11,21,3 2,22,3 3,3,但有些对,如:1,1,2,2,3,3不是数组的一部分,因为没有两个2,三个和一个1。@singh.indolia请看OP的例子。1,1,2,2,3,3包括在内。在您的示例中,这些都包括在内,但在数组中没有两个3,2和1。@singh.indolia我需要myArray0,0Myarray 0,1,myArray0,2,myArray0,3 myArray1,1Myarray 1,2,myArray1,3,3@singh.indolia你为什么决定OP的要求?至少我的答案是这样的。如果下议院选民只想发表评论,也许这个答案可以改进……问题是1个循环而不是3个嵌套循环,您的时间复杂度为On^3
#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;
}
#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;
}