leetcode26
题目
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4],,和 target = 1,与 target 最接近的三个数的和为 2,即(-1 + 2 + 1 = 2).
思路
最简单的做法就是遍历数组,将每组结果的和加起来然后减去target,取绝对值得到minNum,之后的每组遍历采用同样的方法,如果得到的三个数的和减去target去绝对值比minNum小,则保存这三个数的和,这样全部遍历完之后,我们就得到了和最接近target的三个数。
代码
1 int threeSumClosest(int* nums, int numsSize, int target){ 2 int *p1, *p2, *p3, sum; 3 p1 = nums; 4 p2 = nums+1; 5 p3 = nums+2; 6 sum = *p1 + *p2 + *p3; 7 int minNum = abs(sum- target); 8 int rst = sum; 9 for (p1; p1 < &nums[numsSize-2]; p1++){ 10 for (p2=p1+1; p2 < &nums[numsSize-1]; p2++){ 11 for (p3=p2+1; p3 < &nums[numsSize]; p3++){ 12 sum = *p1 + *p2 + *p3; 13 if (abs(sum - target) < minNum) { 14 minNum = abs(sum - target) ; 15 rst = sum; 16 } 17 } 18 } 19 } 20 return rst; 21 }
算法能过,但是效果不是很好,用时比较长,下面是三次修改提交之后的结果。
用时最长的那个遍历是直接用用数组的索引取的值,后面两个用的都是指针,似乎快了一些。
感触
之前刷题都是用python,但是现在我发现python刷题有个弊端,因为它封装了很多东西,所以很多底层的东西你会忽略掉。所以以后我还是用C写吧,另外,写了一段时间C之后,发现C语言真的很美,结构逻辑很清晰。我看之前写的一些python的代码,感觉很乱,虽然python很方便,但是后来发现到处都是,看起来不舒服。