704. 二分查找
1、代码
class Solution {
public int search(int[] nums, int target) {
int left = 0,right = nums.length - 1;
// int mid = (left + right)/2;
if(target > nums[nums.length - 1] || target <nums[0]){
return -1;
}
while(left <= right){
// 保持左闭右闭的规则
int mid = left + (right - left)/2;
if(nums[mid] < target){
left = mid + 1;
}
if(nums[mid] > target){
right = mid - 1;
}
if(nums[mid] == target){
return mid;
}
}
return -1;
}
}
2、分析
(1)由于二分法属于基础思路,所以在看到这道题的时候就按照这个思路走。但是过程中发现自己拿不到while循环的结束条件,最后发现是自己在初始化时候是这么定义的:
int left = nums[0],right = nums[nums.length - 1];
显然将值定为左右端点的话思路过于局限,即只能拿到值而无法拿到下标。而要是将下标作为端点的话,下标和值都可以轻易拿到,所以应该将下标进行初始化:
int left = 0,right = nums.length - 1;
(2)什么情况下可以使用二分法:
有序,不重复。
(3)为什么下标的平均数要这么写:
int mid = left + (right - left)/2;
如果直接写二分之(左+右),有可能会出现整型在数据范围内的溢出。
27. 移除元素
1、代码
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int i = 0;i<=nums.length - 1;i++){
if(nums[i] != val){
nums[slow] = nums[i];
slow++;
}
}
return slow;
}
}
2、分析
(1)这里运用了快慢指针的做法移除元素,快慢指针:两个指针通过一个for循环完成两个for循环的工作。
快指针:寻找新数组的元素,即for遍历寻找。
慢指针:新数组的新元素的下标位置。
(2)这道题由于读题不周新建立了一个数组newNums用来接收题目需要的数据,返回时发现结果一直赋不到新数组。最后发现是程序默认接收的就是nums数组的信息,属于视野局限了。