----学习记录-----
1.二分法
今天刷题的时候发现二分法在有重复数字的有序数组中也可以使用,只需要将基本的二分法稍作改动即可。
//leetcode-704
//这是基本的二分法寻找目标元素
class Solution {
public int search(int[] nums, int target) {
if(nums[0] > target || nums[nums.length - 1] < target){
return -1;
}
int left = 0, right = nums.length - 1;
while(right >= left){
int middle = (left + right) / 2;
if(nums[middle] == target){
return middle;
}
else if(nums[middle] > target){
right = middle - 1;
}
else{
left = middle + 1;
}
}
return -1;
}
}
如果要找target的右边界,就是当nums[middle] == target的时候,也要更新left,同理,寻找左边界,就要在nums[middle] == target的时候更新right。
eg:123333456(比如目标数字为3,最左边的3就是左边界,最后边的3就是右边界)
2.双指针法(快慢指针法)
个人理解:定义两个指针,慢指针一直指向即将被替换元素,快指针一直寻找替换元素。慢指针左侧都是处理好的序列,快指针右侧都是待处理的序列。(基本的思想:快慢指针同时移动,当同时指向不需要存到序列中的元素时,快指针单独移动,直至指向需要存入序列的元素,之后将快指针指向的元素存入慢指针指向的序列位置,之后继续同时移动,以此类推)
//leetcode-283
//将数组中的0全部移动到最后
class Solution {
public void moveZeroes(int[] nums) {
int slow;
int fast = 0;
for(slow = 0; fast < nums.length; fast++){
if(nums[fast] != 0){
nums[slow++] = nums[fast];
}
}
for(int i = slow; i < nums.length; i++){
nums[i] = 0;
}
}
}
未完待续。。。