15.<tag-数组和二分, 双指针>-lt.367-有效的完全平方数 + lt.27-移除元素 + lt.977-有序数组的平方 1.1
lt.367-有效的完全平方数
[案例需求]
[思路分析]
- 方法一, 内置的库函数, Java中求平方根方法: Math.sqrt(num);
- 方法二, 暴力遍历, 从0到num验证, 是否有x * x = num;
- 方法三, 由于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-移除元素
[案例需求]
[思路分析]
- 双指针法(快慢指针法): 通过一个快指针和慢指针在一个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-有序数组的平方
[案例需求]
[思路分析]
- 由于是非递减序列, 即有序的序列, 可以尝试用双指针求解;
- 具体来说是左右双指针, left和right, 通过不断比较平方值大小, 来移动指针;
- 当left指针指向的数字的平方大于right的时候, 把平方值倒序存储到新数组, 然后移动向后移动left指针, right大的时候就是向前移动;
- 注意 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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)