力扣上刷题之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. 寻找两个正序数组的中位数

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

算法的时间复杂度应该为 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;
}

实现思路如下:

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

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

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

相关推荐
李老师讲编程8 分钟前
中国电子学会图形化2020.12月Scratch三级考级题
算法·scratch·信息学奥赛·图形化编程·scratch素材
退休倒计时29 分钟前
【每日一题】LeetCode 53. 最大子数组和 TypeScript
数据结构·算法·leetcode·typescript
旖-旎31 分钟前
FloodFill(图像渲染)(1)
c++·算法·深度优先·力扣
戴西软件43 分钟前
戴西 DLM 许可授权管理系统:破解无网络环境下工业软件授权难题,助力制造企业降本增效
网络·人工智能·python·深度学习·程序人生·算法·制造
2601_961875241 小时前
法考资料2026|全套|资料已整理
数据结构·算法·链表·贪心算法·eclipse·线性回归·动态规划
无限码力1 小时前
美团研发岗 4月18号笔试真题 - 坐标
算法·美团笔试真题·美团笔试题·美团研发岗笔试题·美团研发岗4月18号真题
有点。2 小时前
C++倍增法(练习题)
c++·算法
2601_950526432 小时前
程序设计语言(C)
c语言·数据类型·实验教学·编译预处理·程序设计语言(c)
不会C语言的男孩2 小时前
Linux 系统编程 · 第 4 章:文件属性与元数据
linux·c语言·开发语言