美文网首页
竞赛题-6258. 数组中最长的方波

竞赛题-6258. 数组中最长的方波

作者: 程序员小2 | 来源:发表于2022-12-10 11:14 被阅读0次

    题目:

    给你一个整数数组 nums 。如果 nums 的子序列满足下述条件,则认为该子序列是一个 方波 :

    子序列的长度至少为 2 ,并且
    将子序列从小到大排序 之后 ,除第一个元素外,每个元素都是前一个元素的 平方 。
    返回 nums 中 最长方波 的长度,如果不存在 方波 则返回 -1 。

    子序列 也是一个数组,可以由另一个数组删除一些或不删除元素且不改变剩余元素的顺序得到。

    示例 1 :

    输入:nums = [4,3,6,16,8,2]
    输出:3
    解释:选出子序列 [4,16,2] 。排序后,得到 [2,4,16] 。

    • 4 = 2 * 2.
    • 16 = 4 * 4.
      因此,[4,16,2] 是一个方波.
      可以证明长度为 4 的子序列都不是方波。
      示例 2 :

    输入:nums = [2,3,5,6,7]
    输出:-1
    解释:nums 不存在方波,所以返回 -1 。

    提示:

    2 <= nums.length <= 105
    2 <= nums[i] <= 105

    java代码:

    class Solution {
        public int longestSquareStreak(int[] nums) {
            Arrays.sort(nums);
            int l = 0;
            int r = nums.length - 1;
            int max = -1;
    
            Set<Integer> set = new HashSet<Integer>();
            for (int n : nums) {
                set.add(n);
            }
            Set<Integer> visited = new HashSet<Integer>();
            while (l < r) {
                int count = -1;
                int pingfang = nums[l] * nums[l];
                if (pingfang > nums[r]) {
                    break;
                }
                visited.add(nums[l]);
                while (set.contains(pingfang)) {
                    visited.add(pingfang);
                    if (count == -1) {
                        count = 2;
                    } else {
                        count++;
                    }
    
                    pingfang = pingfang * pingfang;
                }
                l++;
                max = Math.max(max, count);
    
            }
    
    
            return max;
        }
    }
    

    相关文章

      网友评论

          本文标题:竞赛题-6258. 数组中最长的方波

          本文链接:https://www.haomeiwen.com/subject/zqatqdtx.html