C语言刷数组题记录

 

 讲解:https://mp.weixin.qq.com/s/weyitJcVHBgFtSc19cbPdw

 

二分法:

704. 二分查找

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

 

27. 移除元素

https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&mid=2247484304&idx=1&sn=ad2e11d171f74ad772fd23b10142e3f3&scene=21#wechat_redirect

暴力法(两层for循环)和 双指针

复制代码
int removeElement(int* nums, int numsSize, int val)
{
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] == val) {
            // 数组整体向前移一步
            for (int j = i; j < numsSize - 1; j++) {
                nums[j] = nums[j + 1];
            }
            numsSize--;
            i--;
        }
    }
    return numsSize;
}
复制代码

双指针(快慢指针)

复制代码
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];
        }
    }
    return slow;
}
复制代码

 

977. 有序数组的平方

复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int Double(int a)
{
    return a * a;
}

int* sortedSquares(int* nums, int numsSize, int* returnSize)
{
    int left = 0;
    int right = numsSize - 1;
    int index = right;
    *returnSize = numsSize;
    int *res = (int *)malloc(sizeof(int) * numsSize);

    while (left <= right) {
        if (Double(nums[left]) <= Double(nums[right])) {
            printf("1 %d <= %d index=%d\n", Double(nums[left]), Double(nums[right]), index);
            res[index--] = Double(nums[right]);
            right--;
        } else {
            printf("2 %d > %d index=%d\n", Double(nums[left]), Double(nums[right]), index);
            res[index--] = Double(nums[left]);
            left++;
        }
    }
    return res;
}
复制代码

 

209. 长度最小的子数组

滑动窗口

复制代码
int minSubArrayLen(int target, int* nums, int numsSize)
{
    int slow = 0;
    int fast = 0;
    int sum = 0;
    int res = 1e7;
    for (int fast = 0; fast < numsSize; fast++) {
        sum += nums[fast];
        while (sum >= target) {
            int len = fast - slow + 1;
            res = res < len ? res : len;
            // sum = 0; 这是不对的!
            printf("slow:%d\n", slow);
            sum -= nums[slow++];
        }
    }

    return res == 1e7 ? 0 : res;
}
复制代码

 

posted @   胖白白  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示