原题链接:https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-likedhttps://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked 这个题有两种思路,一个就是定义两个指针,一个快指针一个慢指针,当快指针走到非零时交换与慢指针的位置,再让慢指针走一步,快指针一直往前走
void reverse(int* n1, int* n2)
{
int tmp = *n1;
*n1 = *n2;
*n2 = tmp;
}
void moveZeroes(int* nums, int numsSize) {
int slow = 0, fast = 0;
while (fast < numsSize)
{
if(nums[fast])
{
reverse(&nums[slow],&nums[fast]);
slow++;
}
fast++;
}
}
另一种思路就是覆盖零,遇到非零就覆盖前面的位置,后面的位置都置为零,
void moveZeroes(int* nums, int numsSize){
int a = 0;
for(int i = 0;i<numsSize;i++)
{
if(nums[i] != 0)
{
nums[a] = nums[i];
a++;
}
}
for(int i = a; i<numsSize;i++)
{
nums[i] = 0;
}
}
这个题目也是运用双指针的思路,定义左右两个指针,去分别找最大的两个数组,因为一开始就是从左右开始的这时的宽是最大的,只需要关注长的变化即可,与此同时,定义宏可以降低时间复杂度
#define max(a,b) (a>b?a:b)
#define my_min(a,b) (a<b?a:b)
int maxArea(int* height, int heightSize){
int left = 0,right = heightSize-1;
int ret = -1;
while(left<right)
{
int ans = my_min(height[left],height[right]) *(right-left);
ret = max(ret,ans);
if(height[left]<height[right])
left++;
else
right--;
}
return ret;
}