Array Nesting (Leetcode 565)

直观的方法就是拿double loop来做:loop数组,然后针对每一个元素往深再loop找circle,同时用一个set来存deeper loop的元素,最后记录最大的set size. 这样做过不了大数据test

int arrayNesting(vector<int>& nums) {
        if(nums.empty()) return 0;
        int ret_size = 0;
        for(int i=0; i<nums.size(); i++){
            int cur = nums[i];
            set<int> st;
            while(!st.count(cur)){
                st.insert(cur);
                cur = nums[cur];
            }
            if(st.size() > ret_size) ret_size = st.size();
        }
        return ret_size;
    }

参照网上思路后,优化点在于有的元素会被loop好多次 (比如index 1, 3, 5, 7 组成一个circle,那么会重复loop到1,3,5,7; 3,5,7; 5,7; 7)。应该把deeper loop完的数设为-1,这样就不会重复了.
https://discuss.leetcode.com/topic/90538/c-java-clean-code-o-n

int arrayNesting(vector<int>& nums) {
        if(nums.empty()) return 0;
        int ret_size = 0;
        for(int i=0; i<nums.size(); i++){
            if(nums[i] < 0) continue;
            int cur = nums[i];
            nums[i] = -nums[i];
            set<int> st;
            while(!st.count(cur) && cur >= 0){
                st.insert(cur);
                int temp = nums[cur];
                nums[cur] = -nums[cur];
                cur = temp;
            }
            if(st.size() > ret_size) ret_size = st.size();
        }
        return ret_size;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容