一. 简介
本文记录一下力扣的逻辑题。主要是数组方面的,使用 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. 寻找两个正序数组的中位数
给定两个大小分别为 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;
}
实现思路如下:
首先,从数组的头与尾进行统计(即统计最大容器值)。
其次,头与尾的数组元素(即容器的高度值)进行比较,小的一边向数组元素的中间推进。
最后,数组元素轮训一遍,最后得到 最大容器值。