int maxProfit(int* prices, int pricesSize)
{
int minprice = prices[0];
int maxprofit = 0;
for (int i = 0;i < pricesSize;i++)//一一遍历
{
if (minprice >= prices[i])
{
minprice = prices[i];
}
if (minprice<prices[i] && prices[i] - minprice>maxprofit)//确保不亏
{
maxprofit = prices[i] - minprice;
}
}
return maxprofit;//如果亏了,则返回maxprofit的初始值0
}
void moveZeroes(int* nums, int numsSize)
{
int k = 0;
for (int i = 0;i < numsSize;i++)//先存放非0数字
{
if (nums[i] != 0)
{
nums[k] = nums[i];
k++;
}
}
for (int i = k;i < numsSize;i++)//剩下的都是0,k~numsSize 放0
{
nums[k] = 0;
k++;
}
return nums;
}
int cmp_int(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
int threeSumClosest(int* nums, int numsSize, int target) {
qsort(nums, numsSize, sizeof(int), cmp_int);//使用快排进行排序
int best = nums[0] + nums[1] + nums[2];
for (int i = 0; i < numsSize; i++)
{
int left = i + 1;
int right = numsSize - 1;
while (left < right)
{
int min = nums[i] + nums[left] + nums[left + 1];
//先来算出最小值,如果target比最小值还小,后面代码就不用进行了,直接break
if (target < min)
{
if (abs(min - target) < abs(best - target))
{
best = min;
}
break;
}
int max = nums[i] + nums[right] + nums[right - 1];
//如果target比最大值还大,直接break
if (target > max)
{
if (abs(max - target) < abs(best - target))
{
best = max;
}
break;
}
int sum = nums[i] + nums[left] + nums[right];
if (sum == target)//有可能会出现相等的情况,相等了就直接返回
{
return target;
}
if (abs(sum - target) < abs(best - target))
{
best = sum;
}
if (sum > target)
{
right--;
}
else
{
left++;
}
}
}
return best;
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
int* arr=(int*)malloc(sizeof(int)*2);//局部变量函数结束时会销毁,
//所以要用动态数组,动态数组的长度需要用形参返回
*returnSize=2;
int left=0;
int right=numsSize-1;
while(left<right)
{
if(nums[left]+nums[right]==target)
{
arr[0]=left+1;
arr[1]=right+1;
return arr;
}
if(nums[left]+nums[right]>target)
{
right--;
}
else
{
left++;
}
}
return arr;
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
* returnSize=0;
if(numsSize<3)
{ //如果数字不足3个,返回空
return NULL;
}
int flag=1,temp;
while(flag)
{ //冒泡进行数组排序
flag=0;
for(int i=0;i<numsSize-1;i++)
{
if(nums[i]>nums[i+1])
{
temp=nums[i];
nums[i]=nums[i+1];
nums[i+1]=temp;
flag=1;
}
}
}
int **res=(int **)malloc(sizeof(int *)*30010);//建立一个保存结果的二维数组
*returnColumnSizes=(int *)malloc(sizeof(int)*30010);//保存每一行需要存的数字,显然要存3个。
for(int i=0;i<numsSize-1;i++)
{
//依次移动左边固定的第i个数字
int left=i+1,right=numsSize-1;//双指针
if(i>0&&nums[i]==nums[i-1])
{
//如果固定的数字重复且判断过,则跳过。注意不可以写成nums[i]==nums[i+1],因为没判断过,
//可能会跳过left指定的数字。
continue;
}
while(left<right)
{
//双指针循环
int sum=nums[i]+nums[left]+nums[right];
if(sum==0)
{
res[*returnSize]=(int *)malloc(sizeof(int)*3);
res[*returnSize][0]=nums[i];
res[*returnSize][1]=nums[left];
res[*returnSize][2]=nums[right];
(*returnColumnSizes)[*returnSize]=3;//要存的3元组
(*returnSize)++;//行数+1
left++;
while(left<right&&nums[left]==nums[left-1])
{
left++;//去重和上面固定数字去重一样
}
right--;
while(left<right&&nums[right]==nums[right+1])
{
right--;
}
}
else if(sum>0)
{
right--;
}
else if(sum<0)
{
left++;
}
}
}
return res;
}
这次题目有难度!
感谢阅读!!!