查看: 2599| 回复: 13
跳转到指定楼层
上一主题 下一主题
收起左侧

[数组] 智商欠费,死活想不出来

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 qweasdzxc2019 于 2023-2-6 12:56 编辑

能帮忙看看这套题吗287. Find the Duplicate Number
想不出来,看了别人的答案,发现是要通过检测环来看那唯一重复的数,套路代码是:
class Solution {
    public int findDuplicate(int[] nums) {
       。。。边界检查。。。        
        int i = nums[0];
        int j = nums[nums[0]];
        while(i != j){
             i = nums[i];
             j = nums[nums[j]];
        }


        j = 0;        
        while(i != j){
            i = nums[i];
            j = nums[j];
        }
        return i;
    }
}
------------可是给了答案,我还是糊涂了-----------
我在第一个循环那卡主了        
        int i = nums[0];
        int j = nums[nums[0]];
        while(i != j){
             i = nums[i];
             j = nums[nums[j]];
        }
如果我的 test case 是 [3,2,1,4,5,4], 我自己用笔画下来是死循环啊,永远不会相等,但是代码跑起来又没有问题。
i = 3->4->5->4->5->4
j = 4->5->4->5->4->5
但是实际运行打印出来的是:
i = 3 ->4
j= 4 -> 4

想很久也想不明白,我到底哪一步画错了呢

评分

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

查看全部评分


上一篇:1293 障碍物的最短路径
下一篇:发现背模板刷题可以大大提升效率
推荐
 楼主| qweasdzxc2019 2023-2-7 10:05:41 | 只看该作者
全局:
nt2701 发表于 2023-2-6 14:46
不是的lz,你看错了j的value,按照你的test case [3,2,1,4,5,4]来。
那么 j = nums[nums[0] = 3] = 4-> nu ...

还真是。糊涂了。看着代码都能想错。
谢谢你指出来。

评分

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

查看全部评分

回复

使用道具 举报

全局:
想不出来很正常的,这题本质上是道linked list题。建议直接看题解或者视频。

一个很重要的点就是list里面的数字是从1 - n,然后list长度是n+1。你拿value去当index的时候永远不会越界。

这种是属于做过就知道怎么做,没做过的话除了出题人90%都做不出来的。

评分

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

查看全部评分

回复

使用道具 举报

地里匿名用户
推荐
匿名用户-B6RYO  2023-2-7 06:00:26
本帖最后由 匿名 于 2023-2-6 17:04 编辑

俺用的 JavaScript 写的。


/**
* @param {number[]} nums
* @return {number}
*/
var findDuplicate = function(nums) {
    const map = new Map();

    for(let i = 0, len = nums.length;i<len; i++) {
        let num = nums[i];

        if(map.has(num)) {
            return num;
        } else {
            map.set(num, i)
        }
    }
}

俺发现俺的 毛病就是总觉得自己写的有毛病,循环一遍会不会太差,结果发现好多次就是俺想复杂了。

评分

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

查看全部评分

回复

使用道具 举报

🔗
红A 2023-2-7 05:02:58 | 只看该作者
全局:
看起来你的思路很混乱,你有了解过快慢指针模板吗?

我在上班没办法access ppt, 晚上可以给你贴一个
回复

使用道具 举报

🔗
 楼主| qweasdzxc2019 2023-2-7 05:02:58 | 只看该作者
全局:
谢谢。
linkedlist那道环的题我是做的滚花烂俗了,那套题起码看着还知道相遇节点在哪里。可是这里,值和index互相交换,看了答案,还是不明白怎么回事。自己搞一搞例子,结果还是不明白。

嗯,放弃了。准备就背着,真遇到了直接默写代码。
回复

使用道具 举报

🔗
 楼主| qweasdzxc2019 2023-2-7 05:03:57 | 只看该作者
全局:
本帖最后由 qweasdzxc2019 于 2023-2-6 13:05 编辑
红A 发表于 2023-2-6 13:02
看起来你的思路很混乱,你有了解过快慢指针模板吗?

我在上班没办法access ppt, 晚上可以给你贴一个

快慢指针我很熟啊,在给定范围比如圈,走一步和走两步的一定会相遇。但是这里,为啥index和值可以不停交换呢? 而且我发现如果值范围是0-n-1,然后n+1个数的数组,第一个数是0的话,那这套代码就是死循环。
回复

使用道具 举报

🔗
 楼主| qweasdzxc2019 2023-2-7 05:04:19 | 只看该作者
全局:
红A 发表于 2023-2-6 13:02
看起来你的思路很混乱,你有了解过快慢指针模板吗?

我在上班没办法access ppt, 晚上可以给你贴一个

谢谢,期待你的ppt
回复

使用道具 举报

🔗
红A 2023-2-7 05:04:29 | 只看该作者
全局:
另外初始化如果我是你,我会选择i= 0, j = nums[0], 不要一口气跳很多步
应该是初始化之后,你的j一次跳了4步,i走了2步
回复

使用道具 举报

🔗
 楼主| qweasdzxc2019 2023-2-7 05:07:11 | 只看该作者
全局:
红A 发表于 2023-2-6 13:04
另外初始化如果我是你,我会选择i= 0, j = nums[0], 不要一口气跳很多步
应该是初始化之后,你的j一次跳 ...

跳多少步不是取决于值的大小嘛?
回复

使用道具 举报

🔗
红A 2023-2-7 05:08:09 | 只看该作者
全局:
跳一步的意思是把当前value当做index,跳两部一次是value -> index == value -> index 和值的大小无关,是一次value->index转化算一步
回复

使用道具 举报

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

本版积分规则

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