📣 独立日限时特惠: VIP通行证立减$68
楼主: dayu071
跳转到指定楼层
上一主题 下一主题
收起左侧

狗家电面

🔗
xGuo 2018-1-3 23:15:59 | 只看该作者
全局:
我有一个思路 - 前 i 个数的和为前 i 个 index 的和

假设index from 1...N, keep 一个 sum of index
同时keep sum of nums
当 sum of index == sum of nums, we have the answer

int find(vector<int> nums) {
        if (nums.empty()) return 0;
        int nsum = 0, isum = 0;
        for (int i = 0; i < nums.size(); i++) {
                int iPlusOne = i + 1;
                isum += iPlusOne;
                nsum += nums[i];
                if (isum == nsum) return i;
        }
        return nums.size() - 1;
}

评分

参与人数 2大米 +6 收起 理由
dongsancu + 3 给你点个赞!
forbread + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
楼主们是怎么记住面试的题啊?我面试完了感觉就把题立马忘掉了。

评分

参与人数 1大米 +3 收起 理由
forbread + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
xGuo 发表于 2018-1-3 23:15
我有一个思路 - 前 i 个数的和为前 i 个 index 的和

假设index from 1...N, keep 一个 sum of index

好思路!求出的和必定是最小的,所以算法是正确的。
回复

使用道具 举报

🔗
xh_pku 2018-1-3 23:44:34 | 只看该作者
全局:
xGuo 发表于 2018-1-3 23:15
我有一个思路 - 前 i 个数的和为前 i 个 index 的和

假设index from 1...N, keep 一个 sum of index

是的! 根据归纳法,这个 section 之前的已经满足条件了, 那么只需要判断当前最大的为idx + 1就行了
回复

使用道具 举报

🔗
幕云飞 2018-1-3 23:49:38 | 只看该作者
全局:
xGuo 发表于 2018-1-3 23:15
我有一个思路 - 前 i 个数的和为前 i 个 index 的和

假设index from 1...N, keep 一个 sum of index

好思路,可能需要补充下逆序的判断。

public int find(int[] nums) {
  if (nums.length==0) return 0;
  int sum = nums.length*(1+nums.length)/2;
  int left = sum;
  for (int i=0;i<nums.length;i++) {
    int isum = (i+2)*(i+1)/2;
    if ((left-=nums[i]) == isum || left+isum == sum) return i;
  }
  return 0;
}

个人觉得O(logN)不太可能,毕竟去check答案是否是正确的也要O(n),所以会变成O(NlongN)
回复

使用道具 举报

🔗
nh22 2018-1-4 02:15:04 | 只看该作者
全局:
xGuo 发表于 2018-1-3 23:15
我有一个思路 - 前 i 个数的和为前 i 个 index 的和

假设index from 1...N, keep 一个 sum of index

这个思路看着很好,感谢提供思路,觉得很方便。
回复

使用道具 举报

🔗
fentoyal 2018-1-4 03:13:33 | 只看该作者
全局:
贡献个我的思路,很简洁, 大家看对不对:

  1. int solve(vector<int> const &nums)
  2. {
  3.     int j = 1;
  4.     for (int i = 0; i < j; j = max(j, nums[i ++]));
  5.     return j - 1;
  6. }
复制代码

补充内容 (2018-1-4 03:18):
可以略微优化一点速度,提前结束,当然复杂度不变还是O(n):
int solve(vector<int> const &nums)
{
    int j = 1;
    for (int i = 0; j < nums.size() && i < j; j = max(j, nums[i ++]));
    return j - 1;
}
回复

使用道具 举报

🔗
九零 2018-1-4 03:14:55 | 只看该作者
全局:
最方便的o(n)思路难道不是保存到当前位置位置的最大值,然后check最大值是否等于index + 1嘛?

评分

参与人数 1大米 +3 收起 理由
forbread + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
九零 2018-1-4 03:15:50 | 只看该作者
全局:
九零 发表于 2018-1-4 03:14
最方便的o(n)思路难道不是保存到当前位置位置的最大值,然后check最大值是否等于index + 1嘛?

当前位置数组的最大值
回复

使用道具 举报

🔗
fentoyal 2018-1-4 03:23:42 | 只看该作者
全局:
九零 发表于 2018-1-4 03:14
最方便的o(n)思路难道不是保存到当前位置位置的最大值,然后check最大值是否等于index + 1嘛?

握手,看了ls用sum的, 我以为就我这么想呢。。
回复

使用道具 举报

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

本版积分规则

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