优化网站找哪家,做自己的第一个网站,网站建设客户评价,wordpress本地建站文章目录 前言一、704. 二分查找二、27. 移除元素三、34. 在排序数组中查找元素的第一个和最后一个位置总结 前言
这次是C#xff1b;
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_愚者__的博客-CSDN博客 #xff08;java#xff09; 一、704. 二分查找 的优… 文章目录 前言一、704. 二分查找二、27. 移除元素三、34. 在排序数组中查找元素的第一个和最后一个位置总结 前言
这次是C
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_愚者__的博客-CSDN博客 java 一、704. 二分查找 的优先级高于 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 middle1;}else if(nums[middle] target){return middle;}}return -1;
} 二、27. 移除元素h 先赋值后 int removeElement(int* nums, int numsSize, int val){int slow 0;for(int fast 0;fastnumsSize;fast){if(val ! nums[fast]){nums[slow] nums[fast];// slow slow 1;slow ;}}return slow;
} 三、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-华中农大研三 代码
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语言进步很大开心。