15.<tag-数组和二分, 双指针>-lt.367-有效的完全平方数 + lt.27-移除元素 + lt.977-有序数组的平方 1.1

lt.367-有效的完全平方数

[案例需求]
在这里插入图片描述

[思路分析]

  1. 方法一, 内置的库函数, Java中求平方根方法: Math.sqrt(num);
  2. 方法二, 暴力遍历, 从0到num验证, 是否有x * x = num;
  3. 方法三, 由于0到num是完美的顺序序列, 直接二分查找对0到num进行折半查找, 找到合适的mid则返回即可.

[代码实现]

/方法一
class Solution {
    public boolean isPerfectSquare(int num) {
        int x = (int) Math.sqrt(num);
        return x * x == num;
    }
}

方法二, 暴力遍历

class Solution {
    public boolean isPerfectSquare(int num) {
        long x = 1, square = 1;
        while (square <= num) {
            if (square == num) {
                return true;
            }
            ++x;
            square = x * x;
        }
        return false;
    }
}	

在这里插入图片描述

二分法

class Solution {
    public boolean isPerfectSquare(int num) {
        int left = 0, right = num;
        while (left <= right) {
            int mid = (right - left) / 2 + left;
            long square = (long) mid * mid;
            if (square < num) {
                left = mid + 1;
            } else if (square > num) {
                right = mid - 1;
            } else {
                return true;
            }
        }
        return false;
    }
}

在这里插入图片描述

lt.27-移除元素

[案例需求]
在这里插入图片描述
在这里插入图片描述

[思路分析]

  1. 双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
    在这里插入图片描述

[代码实现]

class Solution {
    public int removeElement(int[] nums, int val) {
    //     int left = -1;
    //     int right = 0;

    //     //left 指示符合要求的元素(不等于val的值);
    //     //right遍历数组, 当遇到val时, left后移并交换val
    //     // 不是val时, right继续后移
    //     for(int i = 0; i < nums.length; i++){
    //         if(nums[right] != val){
    //             ++left;
    //             swap(nums, left, right);
    //             ++right;
    //         }else{
    //             ++right;
    //         }
    //     }

    //     return left + 1;
    // }

    
    // public void swap(int[] nums, int left, int right){
    //     int temp = nums[left];
    //     nums[left] = nums[right];
    //     nums[right] = temp;
	/// 解法二, 
        int fastIndex = 0;
        int slowIndex = 0;
        for(slowIndex = 0; fastIndex < nums.length; fastIndex++){
            if(nums[fastIndex] != val){
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }

        return slowIndex;
    }
}

lt.977-有序数组的平方

[案例需求]
在这里插入图片描述

[思路分析]

  1. 由于是非递减序列, 即有序的序列, 可以尝试用双指针求解;
  2. 具体来说是左右双指针, left和right, 通过不断比较平方值大小, 来移动指针;
  3. 当left指针指向的数字的平方大于right的时候, 把平方值倒序存储到新数组, 然后移动向后移动left指针, right大的时候就是向前移动;
  4. 注意 left == right时的指针依然需要存储到数组, 而且是新数组的第一个元素(最小的);
    [代码实现]
class Solution {
    public int[] sortedSquares(int[] nums) {
        
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        int[] res = new int[len];
        int index = len - 1;

        while(left <= right){
            int leftSqr = nums[left] * nums[left];
            int rightSqr = nums[right] * nums[right];

            if(leftSqr >= rightSqr){
                res[index--] = leftSqr;
                ++left;
            }else{
                res[index--] = rightSqr;
                --right;
            }
        }

        return res;
    }
}
posted @   青松城  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示