二分查找
题目链接: leetcode#704
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
题目的前置条件为n个有序的元素,故可通过二分查找解题
找到中间的下标int mid = left + (right-left)/2
为什么不用
(left+right)/2, 主要是为了防止int溢出,如果left、right都足够大,两数相加可能超过int的范围
/**
* 注意区间的定义
* @param nums
* @param target
* @return
*/
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while(left<=right) {
int mid = left + (right-left)/2; // 注意移除的问题,得这样处理
if (nums[mid] > target) { // 说明在区间的左侧
right = mid-1;
} else if (nums[mid] < target) { // 说明在区间的右侧
left = mid + 1;
} else {
return mid; // 相等,直接返回下标
}
}
return -1;
}
移除元素
题目链接: leetcode#27
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
题目要求原地进行移除,而且只需要返回不等于val的元素数量,可以将元素不等于val的元素全部放在数组的前段,可以使用双指针的思路,一个指针fast进行数组的遍历,另一个指针slow,在其对应元素不等于val时与前面的指针进行赋值到当前指针,且指针slow往下走,这样就能保证slow指针之前的元素至不等于val了
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int fast = 0; fast < nums.length; fast++) {
if(val != nums[fast]) {
nums[slow++] = nums[fast];
}
}
return slow;
}