LeetCode704 二分查找
题目链接:704.二分查找
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
关键词:有序查找
● 二分法拥有两种思路:①左闭右闭②左闭右开
这道题不难,掌握开的时候middle=right,闭的时候right加减1即可(以right为例)
下面为了快速记忆放了②的解法
● 补充的基础知识:
(1)变量第一次出现记得声明类型int;
(2)不同与cpp用nums.size()函数,Java用得是nums.length计算数组长度;
(3) left + ((right -left) >> 1) == left + ((right -left)/2) == (left + right)/2。
举个例子: 1010 >> 1 == 0101
代码:
// 版本二
class Solution {
public int search(int[] nums, int target) {
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;
}
}
LeetCode27.移除元素
题目链接:27.移除元素
关键词:移除/更新数组
(1)暴力解法:
思路:数组置换/前移
class Solution {
public int removeElement(int[] nums, int val) {
//注意在Java中数组是固定的,不能随意加减
for(int i =0;i < nums.length;i++){
if(nums[i] == val){ //发现var,与后面的元素进行互换
for(int j=i+1;j<nums.length;j++){
if(nums[j] != val){
nums[i] = nums[j];
nums[j] = val;
break;
}
}
//一直没有break说明后面全是var,最后一个非var下标为i-1
if(nums[i] == val){ //判断是否置换,没换说明已经全部置换完毕
return i;
}
}
}
//循环结束后没有一个元素等于val,返回数组长度
return nums.length;
}
}
(2)快慢指针法
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素
- 慢指针:更新新数组下标的位置
- 最后返回慢指针
class Solution {
public int removeElement(int[] nums, int val) {
// 快慢指针
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
//快指针一直寻找新数组,慢指针负责找到var后和快指针进行置换
if (nums[fastIndex] != val) {
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}