使用单个循环从一个数组中获取所有子数组
本文关键字:数组 一个 获取 单个 循环 | 更新日期: 2023-09-27 18:20:57
我想知道是否有一种算法/模式可以让某人获取/解析给定数组的所有子数组例如使用简单循环。
例如:对于阵列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++)
{
}
}
因为我希望我的算法更快。
#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;
}
您需要将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]
如果你想找到一个数组的所有子数组,那么首先你应该明白数组的子数组应该是连续的,但在字符串的情况下不需要连续,例如:如果我们有一个像[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;
}