【发布时间】:2017-01-12 07:38:25
【问题描述】:
考虑以下问题陈述:
给定一个未排序的整数数组,找到一个与给定数字相加的子数组。如果有多个以 sum 为给定数字的子数组,则打印其中任何一个。
Examples:
Input: arr[] = {1, 4, 20, 3, 10, 5}, sum = 33
Ouptut: Sum found between indexes 2 and 4
Input: arr[] = {10, 2, -2, -20, 10}, sum = -10
Ouptut: Sum found between indexes 0 to 3
Input: arr[] = {-10, 0, 2, -2, -20, 10}, sum = 20
Ouptut: No subarray with given sum exists
在这个site 上,建议使用以下线性时间解决方案,在算法遍历数组时使用映射来存储当前子集的总和:
// Function to print subarray with sum as given sum
void subArraySum(int arr[], int n, int sum)
{
// create an empty map
unordered_map<int, int> map;
// Maintains sum of elements so far
int curr_sum = 0;
for (int i = 0; i < n; i++)
{
// add current element to curr_sum
curr_sum = curr_sum + arr[i];
// if curr_sum is equal to target sum
// we found a subarray starting from index 0
// and ending at index i
if (curr_sum == sum)
{
cout << "Sum found between indexes "
<< 0 << " to " << i << endl;
return;
}
// If curr_sum - sum already exists in map
// we have found a subarray with target sum
if (map.find(curr_sum - sum) != map.end())
{
cout << "Sum found between indexes "
<< map[curr_sum - sum] + 1
<< " to " << i << endl;
return;
}
map[curr_sum] = i;
}
// If we reach here, then no subarray exists
cout << "No subarray with given sum exists";
}
// Driver program to test above function
int main()
{
int arr[] = {10, 2, -2, -20, 10};
int n = sizeof(arr)/sizeof(arr[0]);
int sum = -10;
subArraySum(arr, n, sum);
return 0;
}
使用帖子中提供的测试用例,第二个 if 语句检查是否 current_sum - sum 从未输入。相反,总和被找到并打印在第一个 if 语句中。 所以这里有几点混淆:
1:在地图中查找current_sum-sum的目的是什么?
2:在什么情况下还要输入第二个if语句来放map来解决问题?
【问题讨论】: