代码随想录Day1
二分查找
题目思路:
题目明确要二分查找,其实暴力查找也能过
代码
//暴力解法
class Solution {
public int search(int[] nums, int target) {
for(int i = 0; i < nums.length; i++){
if(nums[i] == target){
return i;
}
}
return -1;
}
}
class Solution {
public int search(int[] nums, int target) {
// 二分搜索
int n = nums.length;
int left = 0;
int right = n-1;
while(left <= right){
int mid = left + ((right-left)>>1);
System.out.println(mid);
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
}
移动元素
class Solution {
// 本人解法
public int removeElement(int[] nums, int val) {
//双指针
int n =nums.length;
int i =0; // 寻找被移除的元素
int j =n-1;// 被移除元素应该被放到的位置
int ret = 0;
for(i = 0; i <= j; i++ ){
if(nums[i] == val){
// 交换元素,将val放到该放的位置
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
// 此时i也要减一,因为交换后的变量可能也为val
i--;
// 被移除元素应该被放到的位置向左边移动
j--;
}else{
ret ++;
}
}
return ret;
}
}
解法·一:改变了元素的次序
解法二: 没有改变次序(重点理解),会覆盖val元素
slowIndex:不等于val的元素应该放的位置
fastIndex: 遍历寻找元素
// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowInde] = nums[fastIndex];
slowInde ++;
}
}
return slowIndex;
}
};