力扣上刷题之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;
}

实现思路如下:

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

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

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

相关推荐
圣保罗的大教堂1 小时前
leetcode 3867. 数对的最大公约数之和 中等
leetcode
To_OC3 小时前
LC 15 三数之和:双指针不难,难的是把去重做对
javascript·算法·leetcode
renhongxia15 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
G.O.G.O.G6 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode
zephyr058 小时前
动态规划-最长上升子序列问题
算法·动态规划
闪电悠米8 小时前
力扣hot100-56.合并区间-排序详解
数据结构·算法·leetcode·贪心算法·排序算法
openKylin8 小时前
与全球技术演进同频,openKylin 3.0从C迈向Rust
c语言·开发语言·rust·开源·开放原子·openkylin
迷茫、Peanut9 小时前
C语言sizeof和strlen
c语言
卡提西亚9 小时前
leetcode-1438. 绝对差不超过限制的最长连续子数组
算法·leetcode·职场和发展
Java面试题总结9 小时前
LeetCode 93.复原IP地址
算法·leetcode·职场和发展·.net