LeetCode题解:三角形的最大周长+移动零

本文介绍了如何解决LeetCode中的两道算法题:一是寻找数组中能构成最大周长三角形的三个边长,采用快速排序策略;二是移动数组中的零元素至末尾,保持非零元素顺序。通过对算法的分析和代码实现,展示了排序在解决问题中的关键作用。
摘要由CSDN通过智能技术生成

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]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

思路

这里我创建了一个变量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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值