[LintCode] Subarray Sum & Subarray Sum II

Given an integer array, find a subarray where the sum of numbers is zero. Your code should return the index of the first number and the index of the last number.

Example

Given [-3, 1, 2, -3, 4], return [0, 2] or [1, 3].

用hashmap来存从nums[0]到nums[i]的和以及当前下标i,遍历数组求前缀和acc[i],如果发现acc[i]的值已经在hashmap中的,那么说明已经找到一段子数组和为0了。

 1 class Solution {

 2 public:

 3     /**

 4      * @param nums: A list of integers

 5      * @return: A list of integers includes the index of the first number 

 6      *          and the index of the last number

 7      */

 8     vector<int> subarraySum(vector<int> nums){

 9         // write your code here

10         map<int, int> has;

11         int sum = 0;

12         has[0] = -1;

13         vector<int> res;

14         for (int i = 0; i < nums.size(); ++i) {

15             sum += nums[i];

16             if (has.find(sum) != has.end()) {

17                 res.push_back(has[sum] + 1);

18                 res.push_back(i);

19                 return res;

20             } else {

21                 has[sum] = i;

22             }

23         }

24         return res;

25     }

26 };

 

Given an integer array, find a subarray where the sum of numbers is between two given interval. Your code should return the number of possible answer.

Example

Given [1,2,3,4] and interval = [1,3], return 4. The possible answers are:

[0, 0]

[0, 1]

[1, 1]

[3, 3]

先求出前缀和,然后枚举求两个前缀和的差。如果差在start与end之间,就给res+1。注意前缀和数组前要插入一个0。

 1 class Solution {

 2 public:

 3     /**

 4      * @param A an integer array

 5      * @param start an integer

 6      * @param end an integer

 7      * @return the number of possible answer

 8      */

 9     int subarraySumII(vector<int>& A, int start, int end) {

10         // Write your code here

11         vector<int> acc(A);

12         acc.insert(acc.begin(), 0);

13         for (int i = 1; i < acc.size(); ++i) {

14             acc[i] += acc[i-1];

15         }

16         int tmp, res = 0;

17         for (int i = 0; i < acc.size() - 1; ++i) {

18             for (int j = i + 1; j < acc.size(); ++j) {

19                 tmp = acc[j] - acc[i];

20                 if (tmp>= start && tmp <= end) ++res;

21             }

22         }

23         return res;

24     }

25 };

 

你可能感兴趣的:(array)