【Leetcode-27.移除元素 -35.搜索插入位置】

简介: 【Leetcode-27.移除元素 -35.搜索插入位置】

Leetcode-27.移除元素

题目:给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

我们的思路还是双指针,定义两个下标fast和slow,从0开始遍历,slow记录数组的长度,fast找到不为val的值,就把值赋给slow,然后slow的长度+1,直到fast>numsSize;

int removeElement(int* nums, int numsSize, int val)
    {
        int fast = 0;
        int slow = 0;
        while (fast < numsSize)
        {
            //当fast下标对应的元素不等于要删除的值,将fast的值赋给slow
            if (nums[fast] != val)
            {
                nums[slow] = nums[fast];
                slow++;
                fast++;
            }
            //否则,说明slow到fast的值都是val的值,fast继续往后走
            else
            {
                fast++;
            }
        }
        return slow;
    }

Leetcode-35. 搜索插入位置

题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

方法一、循环法

int searchInsert(int* nums, int numsSize, int target)
    {
        int i = 0;
        //从头遍历,如果找到target就返回i
        for (i = 0; i < numsSize; i++)
        {
            if (nums[i] == target)
                return i;
        }
        //判断target是否大于最后一个元素,若大于,返回i
        if (nums[i - 1] < target)
            return i;
        //前两种情况都不是,则应该就是需要将target插入数组中;
        //我们只需要找到第一个比target大的数,返回它的下标即可;
        for (i = 0; i < numsSize; i++)
        {
            if (nums[i] > target)
                break;
        }
        return i;
    }

方法二、二分查找法

int searchInsert(int* nums, int numsSize, int target)
    {
        //定义left从头开始和right从尾开始
        int left = 0;
        int right = numsSize - 1;
        //当left小于等于right时循环继续
        while (left <= right)
        {
            //定义left和right的二分值mid
            //使用left + (right - left) / 2,是为了防止溢出
            int mid = left + (right - left) / 2;
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] > target)
                right = mid - 1;
            else if (nums[mid] < target)
                left = mid + 1;
        }
        //当需要插入的时候,left和right总会重合,那么nums[mid]的值总会小于target
        //所以就会执行left = mid + 1,left就会大于right,
        //mid+1就是需要插入的下标,也就是left,所以返回left
        return left;
    }
目录
相关文章
|
4月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
51 1
|
4月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
52 0
|
4月前
|
算法 索引
LeetCode(搜索插入位置)
如何使用二分查找算法来解决LeetCode上的“搜索插入位置”问题,确保时间复杂度为O(log n),并提供了详细的代码实现和分析。
25 2
|
4月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
38 0
Leetcode第三十三题(搜索旋转排序数组)
|
4月前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
32 0
|
4月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
41 0
|
4月前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
40 0
|
6月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
6月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
6月前
|
算法
LeetCode第74题搜索二维矩阵
文章讲解了LeetCode第74题"搜索二维矩阵"的解决方案,利用二分搜索法将问题简化,并通过数学转换找到二维矩阵中的对应元素,展示了将二维问题转化为一维问题的解题技巧。
LeetCode第74题搜索二维矩阵