704.二分查找
1.题目描述
题目链接. - 力扣(LeetCode)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
2.适用场景
- 时间复杂度:O(log n)
- 数组按顺序排列
- 数组中无相同元素(有相同元素下标不唯一)
3.做题思路
左闭右开
左闭右闭
4.代码实现
左闭右闭
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
if(target < nums[0] || target >nums[nums.length-1]){
return -1;
}
while(left <= right){
int mid = (left+right)/2;
if(target<nums[mid]){
right = mid-1;
}
else if(target>nums[mid]){
left=mid+1;
}
else if(target == nums[mid]){
return mid;
}
}
return -1;
}
}
左闭右开
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
if(target < nums[0] || target >nums[nums.length-1]){
return -1;
}
while(left < right){
int mid = (left+right)/2;
if(target<nums[mid]){
right = mid;
}
else if(target>nums[mid]){
left=mid+1;
}
else if(target == nums[mid]){
return mid;
}
}
return -1;
}
}
5. 错误总结
length拼写错误,right+left/2的误差
(left+right)/2建议写成left+(right-left)/2,python
整数支持任意精度,如果c++ 或者 java , 当超过32位会溢出。使用第一种防溢出且项目迁移时不容易出错。
27.移除元素
1.题目描述
2.适用场景
暴力法:时间复杂度
双指针法:时间复杂度O(n)
3.做题思路
指针的应用
4.代码实现
暴力法
class Solution {
public int removeElement(int[] nums, int val) {
int count=nums.length;
for(int n = 0;n<count;n++){
if(nums[n] == val){
for(int j = n+1;j<count;j++){
nums[j-1]=nums[j];
}
n--;
count--;
}
}
return count;
}
}
双指针-快慢指针
class Solution {
public int removeElement(int[] nums, int val) {
int indexflow=0;
for(int indexfar = 0;indexfar < nums.length;indexfar++){
if(nums[indexfar] != val){
nums[indexflow] = nums[indexfar];
indexflow++;
}
}
return indexflow;
}
}
5.错误总结
暴力法上的错误更多,n没有随着数组的缩减而减少循环次数的值, n未减小