Leetcode 题解
[976.三角形的最大周长]
题目链接: https://leetcode-cn.com/problems/largest-perimeter-triangle/
题目描述
给定由一些正数(代表长度)组成的数组 A
,返回由其中三个长度组成的、面积不为零的三角形的最大周长。如果不能形成任何面积不为零的三角形,返回 0
。
思路
这个题目是要找三角形的最大周长,通过这个条件我想到,这道题其实就是考察排序算法,如果将乱序的数组排好序,那么查找最大的周长就变得简单了起来,这里我采用了快速排序算法(从小到大排)。由于这里是找最大周长,所以我直接从数组的最后一位来进行查找,然后判断与其最近的两位是否可以构成一个三角形,如果可以则返回值,如果不可以则查找下一位,直到找到那个max与相邻的两个数能构成一个三角形,如果遍历完整个数组都没有查找到,则返回0。
代码实现
void sort(int *a, int left, int right){
if(left >= right) return ;
int i = left;
int j = right;
int key = a[left];
while(i < j){
while(i < j && key <= a[j]) j--;
a[i] = a[j];
while(i < j && key >= a[i]) i++;
a[j] = a[i];
}
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);
}
int check(int a,int b,int c){
return a+b>c && b+c>a && a+c>b ? 1:0;
}
int largestPerimeter(int* A, int ASize){
int k=ASize-1;
sort(A,0,ASize-1);
while(k>1){
if(check(A[k],A[k-1],A[k-2])) return A[k]+A[k-1]+A[k-2];
k--;
}
return 0;
}
[283.移动零]
题目链接:https://leetcode-cn.com/problems/move-zeroes/
题目描述
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
思路
这里我创建了一个变量k。k的作用是记录不为0元素的位置下标。我首先先用一个循环遍历整个数组,在这次的遍历过程中当遇见为0的元素(nums[i]==0)则跳过,遇见不为0的元素则将该值赋值给上一个不为0的元素的后面同时k自增(nums[k++]=nums[i])。当完成第一次遍历之后,再用第二个循环从下标为k的位置开始将后面的元素全部赋值为0。
void moveZeroes(int* nums, int numsSize){
int i,k;
k=0;
for(i=0;i<numsSize;i++){
if(nums[i]==0) continue;
nums[k++]=nums[i];
}
for(;k<numsSize;k++) nums[k] = 0;
}