704.二分查找 [https://leetcode.cn/problems/binary-search/description/]
思路: 二分查找适用于在有序数组中查找目标值,左边边界为left,右边边界为right,每次使用middle=(right+left)/2,将原数组划分为[left,middle]和[middle,right]两个数组,若middle <target,则目标值落在右边数组,否则落在左边数组,直到right<left时,退出循环,结束划分。若nums[middle]==target,返回middle,否则返回-1,数组无target值。
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
int middle = 0;
while(left<=right){
middle = (left+right)/2;
if(nums[middle] == target){
return middle;
}else if(nums[middle]>target){
right = middle -1 ;
}else
left = middle +1 ;
}
if(nums[middle] == target){
return middle;}
return -1;
}
}
--------------------------------------------------------------------------------------------------------
27.移除元素[https://leetcode.cn/problems/remove-element/]
思路: 数组在内存中申请一段连续的内存地址,所以不能删除元素,只能覆盖元素
本能想到暴力解,是用第一层循环使用i寻找与target相等的元素,第二层用于从i开始,使用j将后续所有元素向前挪动一位。
时间复杂度:O(n^2)
class Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length;
for(int i = 0;i<length;i++){
if(nums[i] == val){
length--;
for(int j =i;j<length;j++){
nums[j]=nums[j+1];
}
i--;
}
}
return length;
}
}
进阶思路:使用快慢指针,快指针quick用于向前判定元素值,慢指针slow用于停留在第一个要移除target值,length用于保存数组长度,双指针默认自增,若quick指向target值,length自减,slow--以抵消自增,保持静止,若quick指向非target值(此时quick指向第一个非target值),使用此值覆盖原slow值,继续循环。
时间复杂度:O(n)
class Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length;
int quick = 0;
int slow = 0;
for (; quick < nums.length; slow++, quick++) {
if (nums[quick] == val) {
slow--;
length--;
} else {
nums[slow] = nums[quick];
}
}
return length;
}
}
这是我的第一篇博客,也是算法的第一篇打卡,希望自己能够努力坚持下去吗
标签:slow,第一天,nums,int,代码,随想录,middle,length,quick From: https://www.cnblogs.com/cssg/p/17956776