算法小菜鸟成长记录Day01-二分查找和双重指针
二分查找和双重指针
今天是代码随想录刷题的第一天,刚开始刷的时候昏昏欲睡,其中用时3h
- 主要实现以下几个部分
- 二分查找:其中二分查找中其收获最大部分就在于对左开右闭区间的理解,如果都是闭区间也就是【a,b】,那么在while中的条件就为while(left <= right ),确保其中是拥有元素也就是说在循环遍历的过程中区间元素可以找到的,比如 【1,1)这种条件就是不成立的。
其中第一个leetcode题目主要使用两种方法进行求解 - 二分查找题目链接:https://leetcode.cn/problems/binary-search/
- 题目讲解链接:https://programmercarl.com/0704.二分查找.html
//暴力解法
class Solution {
public int search(int[] nums, int target) {
for(int i = 0;i<nums.length;i++)
{
if(nums[i] == target)
{
return i;
}
}
return -1;
}
}
左闭右开求解过程
//二分查找求解解法
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
// 如果是左闭右开区间,[1,1)
while(left < right)
{
int mid = left+ (right-left)/2;
if (target < nums[mid])
{
right = mid;
}
else if (target > nums[mid])
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
}
左闭右闭求解过程
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while(left <= right)
{
int mid = (left+right)/2;
if (target < nums[mid])
{
right = mid -1;
}
else if (target > nums[mid])
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
}
- 移除元素题目地址:https://leetcode.cn/problems/remove-element/
- 移除元素题目讲解:https://programmercarl.com/0027.移除元素.html
- 双重指针求解思路:
class Solution {
public int removeElement(int[] nums, int val) {
int size = nums.length;
int slow = 0;
for(int fast = 0; fast < size; fast++)
{
if(nums[fast] != val)
{
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
- 暴力求解
class Solution {
public int removeElement(int[] nums, int val) {
int size = nums.length;
int j = 0;
for(int i = 0; i<size;i++)
{
if(nums[i] == val)
{
for(j = i+1;j <size; j++ )
{
nums[j-1] = nums[j];
}
i--;
size--;
}
}
return size;
}
}
总结:今天的收获还是颇丰的,关于题目的讲解很详细。以前自己没有怎么仔细的刷过题,在实际的代码书写过程中发现刷Leetcode是一件很枯燥的事情,自己一定可以坚持下去感受到算法的快乐