704 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假设 nums 中的所有元素是不重复的。
- n 将在 [1, 10000]之间。
- nums 的每个元素都将在 [-9999, 9999]之间。
package Demo0306;
/**
* @author: 阿斋
* @Date Created in 2024/3/6 && 8:52
* @Description: LeetCode 704.二分查找法
*/
public class SolutionCase01 {
public static void main(String[] args) {
int[] nums = {-1,0,3,5,9,12};
System.out.println(search(nums,6));
System.out.println(search(nums,-1));
System.out.println(search(nums,0));
System.out.println(search(nums,3));
System.out.println(search(nums,5));
System.out.println(search(nums,9));
System.out.println(search(nums,12));
System.out.println(search01(nums,-1));
System.out.println(search01(nums,0));
System.out.println(search01(nums,3));
System.out.println(search01(nums,5));
System.out.println(search01(nums,9));
System.out.println(search01(nums,12));
}
//第一次自己尝试
// public static int search(int[] nums, int target){
// for(int i = 0; i < nums.length; i++){
// System.out.print(nums[i]);
// if(nums[i] == target){
// System.out.println(i);
// break;
// }
// }
// return -1;
// }
//第二次看了视频 学习了二分法 左闭右闭
public static int search(int[] nums , int target){
//二分查找法 先将左和右的位置写出来
int left = 0;
int right = nums.length - 1;
//循环遍历的条件是 左小于等于右
while (left <= right){
//middle为中间的数值
int middle = (left + right)/2;
//target要和数组里的数字比较
if(target > nums[middle]){
left = middle + 1;
}else if(target < nums[middle]){
right = middle - 1;
}else {
return middle;
}
}
return -1;
}
//自己尝试写左闭右开
public static int search01(int[] nums , int target){
int left = 0;
int right = nums.length;
while(left < right){
int midddle = (left + right)/2;
if(target > nums[midddle]){
left = midddle + 1;
} else if (target < nums[midddle]) {
right = midddle;
} else {
return midddle;
}
}
return -1;
}
}
27移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
你不需要考虑数组中超出新长度后面的元素
package Demo0306;
/**
* @author: 阿斋
* @Date Created in 2024/3/6 && 10:00
* @Description: LeetCode 27.移除元素
*/
public class SolutionCase02 {
public static void main(String[] args) {
int[] nums = {3, 2, 2, 3};
// System.out.println(removeElement(nums, 3));
System.out.println(removeElement01(nums, 3));
}
// public static int removeElement(int[] nums, int val){
// int[] nums01 = new int[10];
// int j = 0;
// for (int i = 0; i < nums.length; i++) {
// System.out.print(nums[i] + " ");
// }
// for (int i = 0; i < nums.length; i++) {
// if(nums[i] != val) {
// nums01[j] = nums[i];
// j++;
// }
// }
// for (j = 0; j < nums01.length; j++) {
// System.out.print(nums01[j] + " ");
// }
// System.out.println(j);
// return nums.length;
// }
public static int removeElement(int[] nums, int val) {
//快慢指针都为0
//快指针遍历数组 遇到不同于val的数值 将快指针指向的数值赋给慢指针 直到遍历数组结束
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
public static int removeElement01(int[] nums, int val) {
int length = nums.length;
int gap = 0;
// while (i < length){
// if(val == nums[i]){
// gap++;
// }else {
// nums[i - gap] = nums[i];
// }
// i++;
// }
int i;
for (i = 0; i < length; i++) {
if (val == nums[i]) {
gap++;
} else {
nums[i - gap] = nums[i];
}
}
System.out.println(gap);
return i - gap;
}
}