力扣565题--Java关于for循环优化的问题

博客探讨了Java中for循环内的数组创建导致超时的问题,以及如何通过优化避免这种情况。作者通过调整数组的创建位置和使用原地修改数组的方法,成功解决了超时问题。此外,还讨论了在嵌套循环中,外层循环应遍历大数以提高效率的优化策略。
摘要由CSDN通过智能技术生成

Java关于for循环优化的问题

今天刷了leetcode的每日一题,题是比较简单,但是中间遇到了一个超时的问题,最终分析是因为在for循环内创建了一个数组,把数组放到for循环外边就可以通过。

题目:565. 数组嵌套
我最初的解法是:

    public int arrayNesting(int[] nums) {
        int maxRes = 0;
        int length = nums.length;
        for (int i = 0; i < length; i++){
            int res = 0;
        	boolean[] arr = new boolean[length];
            while (!arr[i]){
                arr[i] = true;
                res++;
                i = nums[i];
            }
            maxRes = Math.max(maxRes, res);
        }
        return maxRes;
    }

我创建一个新的数组用于标记指定位置有没有走到过,并且将数组放在了for循环内,最终导致提交的时候报【超出时间限制】,后面看了别人的题解发现也有这种解题思路的,差别就是他们的数组是在for循环外面的!!!

  • 思考1:后面想了一下为什么我要放在for循环内?因为我想的是每次遍历的时候要把这个数组清空,但其实对题目再进行思考就会发现每一个点都只有一个入度和一个出度,所以不需要担心不重置数组影响后面的判断,可以把创建数组放在外面;继续想,既然每一个点都只有一个入度和一个出度,他们是一个完整的环,那么在原数组上操作也是可以的!这也是另一种解题方法原地标记法。还有,这个题只要求给出最大集合的大小,那么我们只要判断出我们已经求出的maxRes >= nums.length/2就可以停止循环,所以最终提交的代码为:
    public int arrayNesting(int[] nums) {
        int maxRes = 0;
        int length = nums.length;
        for (int i = 0; i < length; i++){
            if(maxRes * 2 >= length){
                break;
            }
            int res = 0;
            while (nums[i] < length){
                int num = nums[i];
                nums[i] = length;
                res++;
                i = num;
            }
            maxRes = Math.max(maxRes, res);
        }
        return maxRes;
    }
  • 思考2:最初提交没通过是因为在for循环中创建数组导致超时,由此想到之前跟朋友聊过的一个问题:两个嵌套的for循环,要想让效率更高,外层循环遍历的应该是大数还是小数? 又去查了一下这个问题,发现有人总结的比较好:java关于for循环的效率优化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值