楼主: mymulife
跳转到指定楼层
上一主题 下一主题
收起左侧

Facebook 电面

🔗
wszk1992 2016-7-19 22:18:28 | 只看该作者
全局:
  1. vector<int> rangeSum(vector<int>& nums, int target) {
  2.         vector<int> sum(nums.size() + 1, 0);
  3.         vector<int> res;
  4.         unordered_map<int, int> map;
  5.         sum[0] = 0;
  6.         //得到sum数组, sum[i] 为 num[0]+...+num[i-1]的和, sum[0]为0
  7.         //问题转化为求满足 sum[j] - sum[i] == target 的解 (j>i) 即 nums在[i,j-1]的和
  8.         for(int i = 0; i < nums.size(); i++) {
  9.                 sum[i + 1] = sum[i] + nums[i];
  10.         }
  11.         //使用hashmap, key为sum[i] + target, value为i. 当找到sum[j] == sum[i] + target时返回此时的index
  12.         for(int i = 0; i < sum.size(); i++) {
  13.                 if(map.find(sum[i]) == map.end()) {
  14.                         map[sum[i] + target] = i;
  15.                 }else {
  16.                         res.push_back(map[sum[i]]);
  17.                         res.push_back(i-1);
  18.                         return res;
  19.                 }
  20.         }
  21.         return res;
  22. }
复制代码
回复

使用道具 举报

🔗
Badger96 2016-7-19 22:28:07 | 只看该作者
全局:
第二题subarray sum吧,lintcode有类似的题
回复

使用道具 举报

🔗
readman 2016-7-19 23:05:28 | 只看该作者
全局:

这个好像是对的..但是你这里的sum[i] 是

sum[i] 为 num[0]+...+num[i-1]的和


而你上一个帖子说的是

sum[i] 为 num[0]+...+num[i]的和


...
回复

使用道具 举报

🔗
Badger96 2016-7-20 00:11:37 | 只看该作者
全局:
试做一下第二题,应该是lintcode上subarray sum的变形:
public ArrayList<Integer> subarraySum(int[] nums, int target) {
    ArrayList<Integer> res = new ArrayList<>();
    HashMap<Integer, Integer> map = new HashMap<>();
    map.put(0, -1);
    int sum = 0;
    for (int i = 0; i < nums.length; i++) {
        sum += nums[i];
        if (map.containsKey(sum - target)) {
            res.add(map.get(sum - target) + 1);
            res.add(i);
            return res;
        } else {
            map.put(sum, i);
        }
    }    return res;
}

上面答案是求出符合答案的任意区间即返回的情况。如果要求写出所有符合的区间,那可能要建一个HashMap<Integer, ArrayList<Integer>>,用arraylist来储存所有sum相同的index,每当遇到map.containsKey(sum)的情况就往arraylist里加当前index,而当map.containsKey(sum - target)时就把那个arraylist里的index都for一遍来输出区间结果,如[index1 + 1, i],[index2 + 1, i]等等。


回复

使用道具 举报

🔗
 楼主| mymulife 2016-7-20 00:57:41 | 只看该作者
全局:
第二题只要返回true/false就行,不需要都找出来
回复

使用道具 举报

🔗
Badger96 2016-7-20 01:26:13 | 只看该作者
全局:
mymulife 发表于 2016-7-20 00:57
第二题只要返回true/false就行,不需要都找出来

那就好,index都不用记了,一个hashset可以
回复

使用道具 举报

🔗
readman 2016-7-20 02:17:22 | 只看该作者
全局:
Badger96 发表于 2016-7-20 00:11
试做一下第二题,应该是lintcode上subarray sum的变形:
public ArrayList subarraySum(int[] nums, int t ...

这个0,-1的corn case 解决的不错!
回复

使用道具 举报

🔗
Badger96 2016-7-20 02:41:35 | 只看该作者
全局:
readman 发表于 2016-7-20 02:17
这个0,-1的corn case 解决的不错!

谢谢这个专门用来解决第一项即为结果的情况
回复

使用道具 举报

全局:
Badger96 发表于 2016-7-20 01:26
那就好,index都不用记了,一个hashset可以

还是要记住index吧。。。比如。arr = [1,2,3] . 所以 sum[] = [1,3,6]. 如果 target = -5 (不能实现)。当int i=0的时候,sum[0]等于1. target-sum[0] 等于6. 在hashset里,就错了。所以还是要HashMap. 感觉。
回复

使用道具 举报

🔗
Badger96 2016-7-31 12:38:17 | 只看该作者
全局:
997562971@qq.co 发表于 2016-7-31 07:59
还是要记住index吧。。。比如。arr = [1,2,3] . 所以 sum[] = [1,3,6]. 如果 target = -5 (不能实现)。 ...

i = 0时还没把6添加进hashset啊,i = 3时才会把6加进去。你如果一开始先把后面的sum加进去当然会错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表