代码随想录算法训练营第一天|LeetCode 704. 二分查找、 27. 移除元素、977.有序数组的平方

目录

一、LeetCode 704. 二分查找

二、LeetCode 27. 移除元素

 三、LeetCode977.有序数组的平方 

一、LeetCode 704. 二分查找

题目链接:. - 力扣(LeetCode)

题目描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

题目思路:

   这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。

        二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢?

 方法一:左闭右闭

int search(int* nums, int numsSize, int target) {
    
    int left=0;
    int right=numsSize-1;
while(left<=right)
{
    int midel=(left+right)/2;
    if(nums[midel]>target)
    {
       right=midel-1; 
    }
    else if(nums[midel]<target)
    {
      left=midel+1;  
    }
    else if(nums[midel]==target)
    {
        return midel;
    }
}
return -1;
}

方法二:左闭右开 

int search(int* nums, int numsSize, int target) {
    
    int left=0;
    int right=numsSize;
        while(left<right)
        {
                int midle=(left+right)/2;
                if(nums[midle]>target)
                {
                    right=midle;
                }
                else if(nums[midle]<target)
                {
                    left=midle+1;    
                }
                else if(nums[midle]==target)
                {
                    return midle;
                }
        }
return -1;
}

二、LeetCode 27. 移除元素

题目链接: . - 力扣(LeetCode)
题目描述:给你一个数组  nums  和一个值  val,你需要  原地 移除所有数值等于  val  的元素。元素的顺序可能发生改变。然后返回  nums 中与  val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k;

题目思路:

双指针做法:通过一个快指针与慢指针在循环中完成;

快指针:寻找新数组的元素,新数组就是不含目标元素的数组;

慢指针:指向更新,在满指针的左边,是已经满足要求的数组;

int removeElement(int* nums, int numsSize, int val) {
    int slow=0;
    for(int fast=0;fast<numsSize;fast++)
    {
        if(nums[fast]!=val)
        {
            nums[slow]=nums[fast];
            slow++;
        }

    }
    return slow;
}

 三、LeetCode977.有序数组的平方 

题目链接:. - 力扣(LeetCode)

题目描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

题目思路: 

数组其实是有序的, 只不过负数平方之后可能成为最大数了。

那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

此时可以考虑双指针法了,i指向起始位置,j指向终止位置。

定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。

如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j]; 。

如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i]; 。

int* sortedSquares(int* nums, int numsSize, int* returnSize) {
    *returnSize = numsSize;
    int left=0;
    int right=numsSize-1;
    int *ret=(int*)malloc(numsSize*sizeof(int));
    int index=numsSize-1;
    while(index>=0)
    {
        int ll=nums[left]*nums[left];
        int rr=nums[right]*nums[right];

        if(ll>rr)
        {
            ret[index]=ll;
            left++;
        }
        else
        {
            ret[index]=rr;
            right--;
        }
        index--;
    }
    return ret;
}

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值