zoukankan      html  css  js  c++  java
  • [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 };
  • 相关阅读:
    How Default Heap Of Process Grows
    希腊字母表
    Ubuntu第一次亲密接触
    Ubuntu中的挂载点(mount point)
    要一专多能
    First touch with JIT debugging
    小学一下环境变量
    安装VMware Tools
    [转]ReiserFS与ext3的比较
    [bbk4485]第二章Flashback Database 05
  • 原文地址:https://www.cnblogs.com/easonliu/p/4543647.html
Copyright © 2011-2022 走看看