二分查找
思想
使用双指针法,利用数组本身升序的特性,以及能够通过下标访问元素的特性,移动左右两个指针,来找到目标答案target。
代码思路
首先定义好要返回的变量,return index,做好代码框架。然后填充具体双指针法进行二分查找的逻辑。
代码块
class Solution {
public int search(int[] nums, int target) {
int index = -1;
int left = 0;
int right = nums.length - 1;
int mid = (left+right) / 2;
while(left <= right){
if(nums[mid] == target){
index = mid;
break;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
mid = (left+right) / 2;
}
return index;
}
}
时间复杂度 O(logn)
空间复杂度 O(1)
移除元素
思路
快慢指针法,一个fast指针指向“新”数组(实际上还是原数组,只不过元素位置发生了变化,需要移除掉val)下标,一个slow指针指向“旧”数组。
代码思路
先定义好两个指针,因为slow指针指向旧数组的下一个位置所以正好在结束的时候就代表新数组长度。所以返回值为slow即可。
代码块
class Solution {
public int removeElement(int[] nums, int val) {
//快慢指针法
if(nums == null ||nums.length == 0) return 0;
int slow = 0;
for(int fast = 0;fast<nums.length;fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
时间复杂度 O(n)
空间复杂度 O(1)
总结
目前都是直接在力扣上刷的题。
今天是学习的day1,之前大概刷过一遍,这次慢慢跟着刷,希望能坚持下来,有新的感受和收获。