代码随想录算法训练营第一天(C)| 704. 二分查找 27. 移除元素

文章目录


前言

这次是C;

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_愚者__的博客-CSDN博客 (java)


一、704. 二分查找

+的优先级高于>>

cpp 复制代码
int search(int* nums, int numsSize, int target){
    int left = 0;
    int right = numsSize-1;
    int middle = 0;

    while(left <= right){
        middle = left + ((right-left)>>1);
        if(nums[middle] > target){
            right = middle-1;
        }
        else if(nums[middle] <target){
            left = middle+1;
        }
        else if(nums[middle] == target){
            return middle;
        }
    }
    return -1;
}

二、27. 移除元素h

先赋值,后++;

cpp 复制代码
int removeElement(int* nums, int numsSize, int val){
    int slow= 0;
    for(int fast = 0;fast<numsSize;fast++){
        if(val != nums[fast]){
            nums[slow] = nums[fast];
            // slow = slow + 1;
            slow ++;
        }
    }
    return slow;
}

三、34. 在排序数组中查找元素的第一个和最后一个位置

难点:

1.在于类型分类上,左右边界需要独自寻找;

  1. 为什么会有"*returnSize = 2",不太能理解它到底起什么作用;如果把这句删掉,后面的resNum就出不来结果;如果更改成"*returnSize = 1",会只出现左右边界的一个


returnSize 是一个指针,它指向一个整数变量,该变量表示要返回的数组的大小。在 searchRange 函数中写 *returnSize = 2;,是在告诉调用者返回的数组 resNums 有两个元素。

这是 LeetCode 中 C 语言版本的函数参数约定,以便在函数返回一个数组时,调用者也能知道数组的大小。在许多其他编程语言中,例如 Python 或 Java,数组或列表自身包含长度信息,所以不需要这种约定。但在 C 中,纯数组并不知道自己的长度,所以需要一个额外的参数来传递这个信息。

在纯C中,数组不知道自己的大小,因此常见的方法是在函数返回一个数组时,通过一个额外的参数(通常是一个指针)来返回其大小。这是在很多传统的C库和应用程序中的常见模式。

LeetCode采用了这个模式,并为C语言解决方案设定了一个约定,要求函数除了返回数组外,还要通过一个额外的指针参数返回数组的大小。这样,LeetCode的判题系统就可以知道返回数组的实际大小,从而正确地评估解决方案。

所以,这是LeetCode为了清晰地得到结果信息而采用的约定,但这种约定在C语言的实践中是常见的。

在其他环境或自己的项目中,如果你没有提供一种告知数组长度的机制,你也会遇到同样的问题。C语言不提供自带的机制来确定动态分配的数组的大小,所以你需要自己跟踪它,或者使用某种约定(如数组的特殊值)来表示数组的结束。

因此,为了正确地处理数组和它的长度,你应该始终提供一个机制(无论是额外的参数、结构体还是其他方法)来传递数组的实际大小。

------from 卡卡鱼

但是"returnSize = 2",和后面的resNums没有关系啊,resNums是我们自己设置的:

leetcode里面 我们实现的函数最终要被调用的 外面的函数会使用这个变量(returnSize)来得到searchRange()返回的数组的大小;

------from Go\C++-Nefelibata-华中农大研三

代码:

cpp 复制代码
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    int leftBorder = searchLeftBorder(nums,numsSize,target);
    int rightBorder = searchRightBorder(nums,numsSize,target);
    *returnSize = 2;
    int *resNums = (int*)malloc(sizeof(int) * 2);
    resNums[0] = leftBorder;
    resNums[1] = rightBorder;
    return resNums;
}

int searchLeftBorder(int *nums,int numsSize,int target){
    int left = 0;
    int right = numsSize-1;
    int leftBorder = -1;
    while(left <= right){
        int middle = left + ((right-left)>>1);
        if(nums[middle] == target){
            leftBorder = middle;
            right = middle - 1;
        }else if (nums[middle] > target) {
            right = middle - 1;
        } else {
            left = middle + 1;
        }
    }
    return leftBorder;
}

int searchRightBorder(int *nums,int numsSize,int target){
    int left = 0;
    int right = numsSize-1;
    int rightBorder = -1;
    while(left <= right){
        int middle = left + ((right-left)>>1);
        if(nums[middle] == target){
            rightBorder = middle;
            left = middle + 1;
        }else if (nums[middle] > target) {
            right = middle - 1;
        } else {
            left = middle + 1;
        }
    }
    return rightBorder;
}

总结

java转C语言,进步很大,开心。

相关推荐
y1su2 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan2 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼3 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机3 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS1003 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码4 小时前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct
TunerT_TQ4 小时前
超立方体Ramsey(openai/math 家族171)H11攻坚日志|D60–D69:Star分组重数、二幂坐标群、奇偶入射语义与Site‑Level候选计数形式化闭环
算法
Rabitebla4 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
远离UE44 小时前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君6584 小时前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法