class Solution {
public int search(int[] nums, int target) {
if(nums==null || target < nums[0] ||target>nums[nums.length-1]){
return -1;
}
int left = 0;
int right = nums.length-1;
while(left <= right){
//int mid = left + ((right - left) >> 1); 防止越界
int mid = (left+right)/2;
if(target < nums[mid]){
right = mid - 1;
}
else if(target > nums[mid]){
left = mid + 1;
}
else if(nums[mid] == target){
return mid;
}
}
return -1;
}
}
思路:
1. 检查数组是否为 null
或者 target
是否小于数组的第一个元素或者大于最后一个元素。如果是,则返回 -1
。
2. 初始化两个指针:left
和 right
,分别指向数组的起始和末尾。
3. 二分查找开始:当 left
不大于 right
时,进入循环。
4. 计算中间值 mid =
(left + right) / 2
5. 比较 target
和 nums[mid]
5.1
如果 target
小于 nums[mid]
,则 target
应该在数组的左半部分,因此更新 right
为 mid - 1
5.2
如果 target
大于 nums[mid]
,则 target
应该在数组的右半部分,因此更新 left
为 mid + 1
。
5.3 如果两者相等,则找到了目标,返回 mid
6.
如果循环结束后还没有找到目标,返回 -1
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int fast = 0; fast<nums.length; fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
思路:
1. 定义两个指针,快指针寻找符合要求的数组元素,慢指针更新新数组下标的位置
2. 初始化慢指针 slowIndex
为 0
。
3. 使用一个 for 循环,其中的快指针 fastIndex
从 0
遍历到数组的最后一个元素。
3.1 在每次循环中,检查 nums[fastIndex]
是否不等于 val
3.2
如果不等于 val
,则将 nums[fastIndex]
的值赋给 nums[slowIndex]
,然后增加 slowIndex
的值
3.3 如果等于 val
,则跳过这个元素,并继续下一个循环
4. 当 fastIndex
遍历完数组后,slowIndex
的值就是数组中不等于 val
的元素的数量,即新的数组长度