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