【代码随想录算法第一天| 704.二分查找 27.移除元素】

数组:定义在连续内存空间上的相同类型的元素的集合

702.二分查找

题目链接:二分查找
文章讲解:代码随想录.二分查找
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

二分前提:有序数组,数组中无重复元素
方法:结合数组的特征,可以为左闭右闭区间[0, 数组长度-1],或者左闭右开区间[0, 数组长度)。
思考:左开右开区间,左开右闭区间,会怎样?

小细节:
1. 加减运算符优先级高于位移运算符
2. 求两个数的中间值:mid = start + (end - start >> 1)

int search(int* nums, int numsSize, int target){
    int mid, start, end = 0;
    
	/*左闭右开区间*/
    for(start = 0, end = numsSize - 1; start <= end;)
    {
        mid = start + (end - start >> 1);

        if(target == nums[mid])
        {
            return mid;
        }
        else if(target > nums[mid])
        {
            start = mid + 1;
        }
        else if(target < nums[mid])
        {
            end = mid - 1;
        }
    }

    return -1;

}
int search(int* nums, int numsSize, int target){
    int mid, start, end = 0;

    /*左闭右开区间*/
    for(start = 0, end = numsSize; start < end;)
    {
        mid = start + (end - start >> 1);

        if(target == nums[mid])
        {
            return mid;
        }
        else if(target > nums[mid])
        {
            start = mid + 1;
        }
        else if(target < nums[mid])
        {
            end = mid;
        }
    }

    return -1;

}

27.移除元素

题目链接:移除元素
文章讲解:代码随想录.快慢指针
视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素

踩坑:快慢指针角色必须如此吗?尝试慢指针判断数值,快指针++未成功,二刷再看看

int removeElement(int* nums, int numsSize, int val){
    int i, j = 0;

    for(i = 0, j = 0; j < numsSize; j++)
    {
        /*j:快指针,用于获取满足要求的数值*/
        if(val != nums[j])
        {
        	/*i:慢指针,用来记录最终的数组下标*/
            nums[i++] = nums[j];
        }
    }

    return i;
}
int removeElement(int* nums, int numsSize, int val){
    int i, j, cnt = 0;

    if(1 == numsSize)
    {
        if(val == nums[0])
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
	
	/*暴力解法*/
    for(i = 0; i < numsSize - cnt; )
    {
        if(val == nums[i])
        {
            for(j = i; j < numsSize - cnt - 1; j++)
            {
                nums[j] = nums[j + 1];
            }
            cnt++;
        }
        else
        {
            i++;
        }
    }

    return (numsSize - cnt);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值