又一次试图开始刷算法题,所以报了训练营,希望可以好好坚持~
对于Java的库函数还是过于不熟悉了,提醒自己对于nums.length的使用
704. 二分查找
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
是很基础的算法,提交的时候有看到自己以前写的时候没有处理好边界,这次一遍过了。
我常用的是左闭右闭区间这种写法:
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target) return mid;
else if(nums[mid] < target){
left = mid+1;
}
else{
right = mid-1;
}
}
同时我注意到在题解里还有左闭右开这种写法,提醒自己不要混淆。
27. 移除元素
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
这道题我用的暴力方法快速解决:
class Solution {
public int removeElement(int[] nums, int val) {
int len = nums.length;
for(int i = 0; i < len; i++){
if(nums[i]==val){
for(int j = i + 1; j < len; j++){
nums[j-1] = nums[j];
}
len--;
i=i-1;
}
}
return len;
}
}
下面来记录一下双指针:
主要是通过减少一个for循环来加速时间的,暴力算法的时间复杂度是O(n^2),而优化为双指针法使时间复杂度变为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];
slowIndex++;
}
}
return slowIndex;
}
}
因为删除数组中元素的本质是向前覆盖,所以每次当快指针指向新的内容的时候,就同时移动慢指针,通过赋值实现覆盖,当快指针遍历完毕的时候,直接返回慢指针即是新数组所对应的下标。