# 题目考察点:二分法
## 704_题目链接:https://leetcode.cn/problems/binary-search/
### 代码实现
package LeetCode;
public class YangSibo_704 {
public static void main (String args []) {
int [] nums = {-1,0,3,5,9,12};
int target = 9;
YangSibo_704_1 demo1 = new YangSibo_704_1();
YangSibo_704_2 demo2 = new YangSibo_704_2();
System.out.println("demo1:" + demo1.search(nums,target));
System.out.println("demo2:" + demo2.search(nums,target));
}
}
class YangSibo_704_1 {
public int search(int[] nums, int target) {
if (nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length;
int middle = 0;
while (left < right) {
middle = (left + right) / 2;
if (nums[middle] > target) {
right = middle;
}else if (nums[middle] < target) {
left = middle + 1;
}else {
return middle;
}
}
return -1;
}
}
class YangSibo_704_2 {
public int search(int[] nums, int target) {
if (nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length -1 ;
int middle = 0;
while (left <= right) {
middle = (left + right) / 2;
if (nums[middle] > target) {
right = middle - 1;
}else if (nums[middle] < target) {
left = middle + 1;
}else {
return middle;
}
}
return -1;
}
}
### 解题注意事项
1、左闭右开与左闭有闭的比较范围
左闭右开 [left,right) 范围是[0,nums.length) while(left < right)
左闭右闭 [left,right] 范围是[0,nums.length-1] while(left <= right)
2、middle取值一定要确定middle是否满足在新半区的比较范围内
左闭右开时
当middle的值 > target target在middle的左边 更新左半区 right = middle
当middle的值 < target target在middle的左边 更新右半区 left = middle +1
左闭右闭时
当middle的值 > target target在middle的左边 更新左半区 right = middle -1
当middle的值 < target target在middle的左边 更新右半区 left = middle +1
3、704_1写的是左闭右开 704_2写的是左闭右开
# 题目考察点:双指针
## 27_题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
### 代码实现
package LeetCode;
public class YangSibo_27 {
public static void main (String args []) {
int [] nums = {0,1,2,2,3,0,4,2};
int val = 2;
YangSibo_27_1 demo1 = new YangSibo_27_1();
YangSibo_27_2 demo2 = new YangSibo_27_2();
System.out.println("demo1:" + demo1.removeElement(nums,val));
System.out.println("demo2:" + demo2.removeElement(nums,val));
}
}
class YangSibo_27_1 {
public int removeElement(int[] nums, int val) {
int length = nums.length;
if (length == 0 ) {
return 0;
}
for (int i = 0; i < length; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < length; j ++) {
nums [j-1] = nums [j];
}
i--;
length--;
}
}
return length;
}
}
class YangSibo_27_2 {
public int removeElement(int[] nums, int val) {
int length = nums.length;
if (length == 0 ) {
return 0;
}
int slow = 0;
for (int fast = 0; fast < length; fast ++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
### 解题注意事项
1、基本概念
暴力破解也可行,注意不要越界
删除数组的某一个数据,真实的操作是覆盖,数组是一块连续的地址
2、快慢指针的区分
fast快指针需要找到不属于新数组的数据
slow慢指针是需要将属于新数组的数据下标记录下来,并记录新数组的数量