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


    文章目录


    前言

    这次是C;

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


    一、704. 二分查找

    +的优先级高于>>

    1. int search(int* nums, int numsSize, int target){
    2. int left = 0;
    3. int right = numsSize-1;
    4. int middle = 0;
    5. while(left <= right){
    6. middle = left + ((right-left)>>1);
    7. if(nums[middle] > target){
    8. right = middle-1;
    9. }
    10. else if(nums[middle]
    11. left = middle+1;
    12. }
    13. else if(nums[middle] == target){
    14. return middle;
    15. }
    16. }
    17. return -1;
    18. }

    二、27. 移除元素h

    先赋值,后++;

    1. int removeElement(int* nums, int numsSize, int val){
    2. int slow= 0;
    3. for(int fast = 0;fast
    4. if(val != nums[fast]){
    5. nums[slow] = nums[fast];
    6. // slow = slow + 1;
    7. slow ++;
    8. }
    9. }
    10. return slow;
    11. }

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

    难点:

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

    2. 为什么会有“*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-华中农大研三

    代码:

    1. int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    2. int leftBorder = searchLeftBorder(nums,numsSize,target);
    3. int rightBorder = searchRightBorder(nums,numsSize,target);
    4. *returnSize = 2;
    5. int *resNums = (int*)malloc(sizeof(int) * 2);
    6. resNums[0] = leftBorder;
    7. resNums[1] = rightBorder;
    8. return resNums;
    9. }
    10. int searchLeftBorder(int *nums,int numsSize,int target){
    11. int left = 0;
    12. int right = numsSize-1;
    13. int leftBorder = -1;
    14. while(left <= right){
    15. int middle = left + ((right-left)>>1);
    16. if(nums[middle] == target){
    17. leftBorder = middle;
    18. right = middle - 1;
    19. }else if (nums[middle] > target) {
    20. right = middle - 1;
    21. } else {
    22. left = middle + 1;
    23. }
    24. }
    25. return leftBorder;
    26. }
    27. int searchRightBorder(int *nums,int numsSize,int target){
    28. int left = 0;
    29. int right = numsSize-1;
    30. int rightBorder = -1;
    31. while(left <= right){
    32. int middle = left + ((right-left)>>1);
    33. if(nums[middle] == target){
    34. rightBorder = middle;
    35. left = middle + 1;
    36. }else if (nums[middle] > target) {
    37. right = middle - 1;
    38. } else {
    39. left = middle + 1;
    40. }
    41. }
    42. return rightBorder;
    43. }

    总结

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

  • 相关阅读:
    C-Model以及ASIC设计
    类中报错 xxx does not name a type可能因为类中修改了对象
    序列化进阶2-常见序列化框架
    无痛迁移:图解 Kubernetes 集群升级步骤
    路由和node环境搭建
    LeetCode算法题解|LeetCode435. 无重叠区间、LeetCode763. 划分字母区间、LeetCode56. 合并区间
    HIVE和HBASE的区别和联系
    hashMap索引原理
    [附源码]JAVA毕业设计会议室租赁管理系统(系统+LW)
    阿里发布大模型发布图结构长文本处理智能体,超越GPT-4-128k
  • 原文地址:https://blog.csdn.net/m0_51671538/article/details/133087479