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

一. 简介

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

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

1. 两数之和

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

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

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

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

输出:[0,1]

**解释:**因为 nums[0] + nums[1] == 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;
}

实现思路如下:

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

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

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

相关推荐
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
搬砖的小码农_Sky5 小时前
C语言:数组
c语言·数据结构
Swift社区6 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman7 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年7 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Dong雨8 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna8 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie
liujjjiyun8 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥8 小时前
c++中mystring运算符重载
开发语言·c++·算法
trueEve9 小时前
SQL,力扣题目1369,获取最近第二次的活动
算法·leetcode·职场和发展