代码随想录一刷-Day01
LeetCode704. 二分查找
这道属于是入门必刷了,但是虽然能做出来,在细节上还是不够注意
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (left + (right - left) / 2);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
首先如果右边界取 数组长度-1
,则循环跳出的条件应该是左边界小于等于
右边界
其次,在循环内,不符合条件要将左/右边界下标赋值给 mid 时,需要取 left = mid + 1
或 right = mid - 1
,否则可能导致死循环
这是细节问题,其他倒没什么值得关注的地方了
时间复杂度:O(log n)
空间复杂度:O(1)
LeetCode27. 移除元素
题目要求原地移除,对数组进行原地操作首先要想到的就是快慢指针
不过做题时仍然是对细节不够注意,起初我写出来的是:
public int removeElement(int[] nums, int val) {
if (nums == null || nums.length == 0) {
return 0;
}
int slow = 0, fast = 0;
while (fast < nums.length - 1) {
if (nums[fast] != val) {
nums[slow++] = nums[fast++];
} else {
fast++;
}
}
return slow;
}
提交后示例不通过,当 nums 长度为 1 时,数组长度始终为 0
起初我没有进行 Debug,自以为是地认为就是在 if-else 中出现的问题,结果实际上是在 while 的循环条件中,快指针没有用小于等于
最后只要改成 fast <= nums.length - 1
就可以了
最终正确的 code:
public int removeElement(int[] nums, int val) {
if (nums == null || nums.length == 0) {
return 0;
}
int slow = 0, fast = 0;
while (fast <= nums.length - 1) {
if (nums[fast] != val) {
nums[slow++] = nums[fast++];
} else {
fast++;
}
}
return slow;
}
时间复杂度:O(n)
空间复杂度:O(1)