文章链接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
题目链接:https://leetcode.cn/problems/binary-search/
(1)第一种写法:左闭右闭。
因为是根据区间的定义,确定循环中的变量的取值。
class Solution {
public int search(int[] nums, int target) {
// 避免特殊情况
if(target < nums[0] || target > nums[nums.length-1]){
return -1;
}
// 左闭右闭版本
int left = 0 ,right = nums.length-1;
int middle;
// int middle = (left+right)/2;
int result = -1;
while(left <= right){
middle = (left+right) >> 1;
if(nums[middle]>target){
right = middle - 1;
}else if (nums[middle] < target){
left = middle + 1;
}else
return middle;
}
return -1;
}
}
(2)第二种写法:左闭右开
有如下两点:
class Solution {
public int search(int[] nums, int target) {
// 避免特殊情况
if(target < nums[0] || target > nums[nums.length-1]){
return -1;
}
// 左闭右开版本
int left = 0 ,right = nums.length;
int middle;
// int middle = (left+right)/2;
// int result = -1;
while(left < right){
middle = (left+right) >> 1;
if(nums[middle]>target){
right = middle;
}else if (nums[middle] < target){
left = middle + 1;
}else
return middle;
}
return -1;
}
}
题目连接:https://leetcode.cn/problems/remove-element/description/
暴力解法:
时间复杂度(O^2)
两层for循环,第一个for循环遍历数组元素,第二个for循环更新数组
class Solution {
public int removeElement(int[] nums, int val) {
int x = nums.length;
for(int i = 0; i < x;i++){
if(nums[i] == val){
for(int j=i+1;j<x;j++){
nums[j-1] = nums[j];
}
i--;
x--;
}
}
return x;
}
}
双指针法:
时间复杂度O(n)
定义一个慢指针,一个快指针,要明确的是这里快指针和慢指针有什么不同。
慢指针,指向的是新数组下标的位置。
快指针,指向的是不含有目标元素的数组,跳过值一致的元素
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
for(int fastIndex = 0; fastIndex< nums.length;fastIndex++){
if(nums[fastIndex] != val){
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
}