代码随想录刷题训练营的第一天。
第一题、LeetCode 704 二分查找: https://leetcode.cn/problems/binary-search/
两种思路,left和right的左闭右闭和左闭右开
左闭右闭(C++)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right){
int mid = left + (right - left) / 2; //防止溢出
if (nums[mid] > target){
right = mid -1; //target在mid左侧
}
else if (nums[mid] < target){
left = mid + 1; //target在mid右侧
}
else{
return mid;
}
}
return -1;
}
};
左闭右开(java)
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;
while (left < right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid;
}
return -1;
}
}
左闭右开的思路:
左闭右开,所以更新right时不能减一,否则可能因为开区间错过right左侧第一个数。
注意:数组的length在java里是.length不用括号,C++里是.size()
第二题、LeetCode 27 移除元素:https://leetcode.cn/problems/remove-element/
暴力解法:两个for套在一起,第一个for遍历,第二个for更新数组位置。
双指针法:核心在于创造一个新的数组,而不是删除原来数组中的元素。设置快指针和慢指针,快指针找到新数组需要的数,慢指针更新新数组中元素的位置。
C++:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++){
if (nums[fastIndex] != val){ //关键在于不等于目标值的时候才需要更新
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
};
java:
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
for(int fastIndex = 0; fastIndex < nums.length; fastIndex++){
//数组的length在java里是.length不用括号,C++里是.size()
if (nums[fastIndex] != val){
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
}