代码随想录算法训练营第1天|二分查找|移除元素
- 704 二分查找
题目链接:https://leetcode.cn/problems/binary-search/
文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
int search(int* nums, int numsSize, int target) {
int left,right,mid;
left=0;
/* right=numsSize-1;
while(left<=right)
{
mid=(left+right)/2;
if(nums[mid]<target)
left=mid+1;
else if(nums[mid]>target)
right=mid-1;
else return mid;
}上面是[]的程序,下面[)
*/
right=numsSize;
while(left<right)
{
mid=(left+right)/2;
if(nums[mid]<target)
left=mid+1;
else if (nums[mid]>target)
right=mid;
else return mid;
}
return -1;
}
总结
在二分法中最重要的是对区间合法的判断(前提是你是有序数组才可进行二分),
eg:二分法也就是你回家买了一颗长的萝卜,你放那好几天,然后萝卜有地方坏了。由于萝卜太长了你首先对半切,然后找到坏的一半继续对半切,直到把坏的部分给切出来扔掉。在这之间你不要把人家给切的范围给搞错力。
你可以通过[1,1]和[1,1)的方法来举例说明合法性 ,以保证自己代码的后续不会写错。
- 27 移除元素
题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
int removeElement(int* nums, int numsSize, int val) {
int front,slow,k;
front=0;
slow=0;
k=0;
//双指针算法
for(front;front<numsSize;front++)
if(nums[front]!=val)
nums[slow++]=nums[front];
/*
//暴力
slow=numsSize;
for(int i=0;i<slow;i++)
{
if(nums[i]==val)
{
for(int j=i+1;j<slow;j++)
nums[j-1]=nums[j];
i--;
slow--;
}
}
*/
return slow;
}
总结
在移除元素,也就是删除数组中选定的元素,有2种方法,(1)双指针(2)暴力
,(1)里面双指针就是非特定的就保持不变特定就覆盖,eg:相当于哥们在菜市场挑苹果,你这有A,B两箱子,A中是原有箱子,B是空箱子,你现在要挑好苹果,你在A里看见一个好苹果就往B箱子里面扔,看见坏的就不扔,到最后B箱子里面就都是好苹果,然后你就说我箱子里面都是好苹果(把A取代了)。(2)暴力就是你也去挑苹果,你是按顺序把坏苹果给挑出来,坏苹果的位置被后续苹果给顶替。也就这意思。
ps:新手第一回在csdn写博客,大佬们多多见谅(有没有大佬带我做人工智能的项目啊,小白想尝试一下学习人工智能,但是不知道咋学,请大佬带带)