力扣上刷题之C语言实现(数组)

一. 简介

本文记录一下力扣的逻辑题。主要是数组方面的,使用 C语言实现。

二. 力扣上刷题之C语言实现

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

例如: **输入:**nums = 2,7,11,15, target = 9

输出:0,1

**解释:**因为 nums0 + nums1 == 9 ,返回 0, 1 。

代码实现如下:

复制代码
int twoSum(int* nums, int numsSize, int target, int* ret_data_index)
{
    int i = 0, j = 0;

    for(i = 0; i < (numsSize-1); i++)
    {
        for(j = i+1; j < numsSize; j++)
        {
            if((nums[i] + nums[j]) == target)
            {
                ret_data_index[0] = i;
                ret_data_index[1] = j;
                return 0;
            }
        }
    }

    return -1;
}

2. 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入: nums1 = 1,3, nums2 = 2
输出: 2.00000
**解释:**合并数组 = 1,2,3 ,中位数 2

代码实现如下:

复制代码
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) 
{
    int i = 0, m = 0, n = 0;
    int k = nums1Size + nums2Size;
    int buf[k];
    int temp = 0;
    double median_data;
    int j = 0;

    memcpy(buf, nums1, nums1Size*sizeof(int));
    memcpy(&buf[nums1Size], nums2, nums2Size*sizeof(int));

    //sort from smallest to largest
    for(m = 0; m < k; m++)
    {
        for(n = m+1; n < k; n++)
        {
            if(buf[m] > buf[n])
            {
                temp = buf[m];
                buf[m] = buf[n];
                buf[n] = temp;
            }
        }
    }

    i = k % 2;
    j = k / 2;
    if(0 == i)
    {
        median_data = ((double)buf[j-1] + (double)buf[j])/2;
    }
    else {
        median_data = (double)buf[j];
    }
    return median_data;
}

实现思路如下:

首先,将两个数组元素拷贝到一个数组中。

其次,对新拷贝的数组元素进行从小到大排序。

最后,找到中间位置的值。

3. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

例如:

代码实现如下:

复制代码
#define MIN(a,b) ((a < b)? a:b)
#define MAX(a,b) ((a > b)? a:b)

int maxArea(int* height, int heightSize) 
{
    int min_h = 0;
    int left = 0 ,right = heightSize-1;
    int area = 0, max_area = 0;

    while(left < right)
    {
        min_h = MIN(height[left], height[right]);
        area = (right - left)* min_h;
        max_area = MAX(max_area, area);

        ((height[left] < height[right])? left++:right--);
    }

    return max_area;
}

实现思路如下:

首先,从数组的头与尾进行统计(即统计最大容器值)。

其次,头与尾的数组元素(即容器的高度值)进行比较,小的一边向数组元素的中间推进。

最后,数组元素轮训一遍,最后得到 最大容器值。

相关推荐
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
wuminyu4 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
小蒋学算法4 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
荆棘鸟智能4 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
hhb_6185 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
朝朝辞暮i5 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
苏打豆6 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
FluxArt6 小时前
GPT Image 2.5 中文提示词教程:Flux Art 可复用模板
前端·gpt·算法
思麟呀6 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法
阜阳山君GEO7 小时前
豆包 SEED 新版本 GEO 优化:信源金字塔、打分体系与避坑落地指南
人工智能·算法