LeetCode 2501 数组中最长的方波 Java

在这里插入图片描述
方法一,哈希表+枚举

  1. 构造哈希集合,记录出现过的数字
  2. 枚举遍历
import java.util.HashSet;
import java.util.Set;

class Solution {
    public int longestSquareStreak(int[] nums) {

        //构造哈希表集合,记录出现过的数字,转long型,避免求平方后int越界
        Set<Long> set = new HashSet<>();
        for (long num : nums) {
            set.add(num);
        }

        int maxLen = -1;
        //直接枚举,依据题意找到了子序列后从小到达排序,因此无需排序,无需判断索引大小
        for (long num : nums) {
            int subLen = 1;
            num *= num;

            //若包含平方数,继续枚举
            while (set.contains(num)) {
                subLen++;
                num *= num;
            }

            //更新最值,子序列的长度至少为2
            if (subLen > 1 && subLen > maxLen) {
                maxLen = subLen;
            }
        }
        return maxLen;
    }
}

在这里插入图片描述
方法二,排序+二分

  1. 先排序
  2. 遍历时,如果nums[i]*nums[i]>nums[n-1]时,可以直接跳出循环
  3. 在查找是否存在当前值的平方时,可以采用二分法查找,因为只需要查找是否存在,所以可以用库函数Arrays.binarySearch(int[] nums, int target),返回值idx小于0,表示不存在
import java.util.Arrays;

class Solution {
    public int longestSquareStreak(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        int ans = -1;
        for (int i = 0; i < n; i++) {
            if (nums[i] * nums[i] > nums[n - 1]) {
                break;
            }
            int idx = i, cnt = 0;
            while (idx >= 0) {
                idx = Arrays.binarySearch(nums, nums[idx] * nums[idx]);
                if (idx >= 0) {
                    cnt++;
                }
            }
            ans = Math.max(ans, cnt + 1);
        }
        return ans > 1 ? ans : -1;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值