> 文档中心 > leetcode刷题报告5

leetcode刷题报告5


📜个人简介

⭐️个人主页:摸鱼の文酱博客主页🙋‍♂️
🍑博客领域:java编程基础,mysql
🍅写作风格:干货,干货,还是tmd的干货
🌸精选专栏:【Java】【mysql】 【算法刷题笔记】
🎯博主的码云gitee,平常博主写的程序代码都在里面。
🚀支持博主:点赞👍、收藏⭐、留言💬
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

今日学习内容:排序APi

今天的学习内容是为了熟练使用c/java的库函数中的排序函数,以后会补齐对于其他排序算法的练习使用

今日刷题:

🎯912. 排序数组

题目描述:
给你一个整数数组 nums,请你将该数组升序排列。

🐾思路一:直接使用库函数

java:

public int[] sortArray(int[] nums) { Arrays.sort(nums); return nums;    }

c:

int cmp(const void*a, const void* b) {    return *(int *)a - *(int *)b;      // (1)}int* sortArray(int* nums, int numsSize, int* returnSize){    qsort(nums, numsSize, sizeof(int), cmp);  // (2)    *returnSize = numsSize;     // (3)    return nums;  // (4)}

🎯169. 多数元素

问题描述:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

🐾思路一:直接使用库函数

java

public int majorityElement(int[] nums) {int len = nums.length, half = len >> 1;while (true) {int index = (int) (Math.random() * len);int num = nums[index];int count = 0;for (int i = 0; i < len; i++) {count += nums[i] == num ? 1 : 0;}if (count > half) {return num;}}}

c:

int cmp(const void *a, const void *b) {    return (*(int *)a) - (*(int *)b);}int majorityElement(int* nums, int numsSize){    qsort(nums, numsSize, sizeof(int), cmp);    return nums[numsSize/2];      // (1)}

🎯217. 存在重复元素

问题描述:给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

🐾思路一:直接使用库函数

java:set自带去重

public boolean containsDuplicate(int[] nums) { Set<Integer> res = new HashSet<Integer>(); for(int i:nums)     res.add(i); return res.size()<nums.length?true:false;    }

c;

int cmp(const void *a, const void *b) {    return (*(int *)a) - (*(int *)b);}bool containsDuplicate(int* nums, int numsSize){    int i;    qsort(nums, numsSize, sizeof(int), cmp);    for(i = 1; i < numsSize; ++i) { if(nums[i] == nums[i-1]) {    // (1)     return true; }    }    return false;}

🎯164. 最大间距

问题描述:给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。

您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。

🐾思路一:直接使用库函数

java:

  public int maximumGap(int[] nums) { Arrays.sort(nums); int max = 0; for (int i = 1; i < nums.length; i++) {     max = Math.max(max, nums[i] - nums[i - 1]); } return max;    }

c:

int cmp(const void *a, const void *b) {    return *(int *)a - *(int *)b;}int maximumGap(int* nums, int numsSize){    int i, max = 0;    qsort(nums, numsSize, sizeof(int), cmp);    for(i = 1; i < numsSize; ++i) { if(nums[i] - nums[i-1] > max) {     // (1)     max = nums[i] - nums[i-1]; }    }    return max;}

🎯905. 按奇偶排序数组

问题描述:给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。

你可以返回满足此条件的任何数组作为答案。

🐾思路一:直接使用库函数

java:

public int[] sortArrayByParity(int[] A) { Integer[] B = new Integer[A.length]; for (int t = 0; t < A.length; ++t)     B[t] = A[t]; Arrays.sort(B, (a, b) -> Integer.compare(a%2, b%2)); for (int t = 0; t < A.length; ++t)     A[t] = B[t]; return A;    }

c:

int Qua(int x) {    return x & 1;}int cmp(const void *a, const void *b) {    return Qua(*(int *)a) - Qua(*(int *)b);}int* sortArrayByParity(int* nums, int numsSize, int* returnSize){    int i;    int *ret = (int *)malloc( sizeof(int) * numsSize );  // (1)    for(i = 0; i < numsSize; ++i) { ret[i] = nums[i];    // (2)    }    qsort(ret, numsSize, sizeof(int), cmp);// (3)    *returnSize = numsSize;  // (4)    return ret;}

🎯539. 最小时间差

问题描述:给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

🐾思路一:直接使用库函数

java

public int findMinDifference(List<String> timePoints) { Collections.sort(timePoints); int ans = Integer.MAX_VALUE; int t0Minutes = getMinutes(timePoints.get(0)); int preMinutes = t0Minutes; for (int i = 1; i < timePoints.size(); ++i) {     int minutes = getMinutes(timePoints.get(i));     ans = Math.min(ans, minutes - preMinutes); // 相邻时间的时间差     preMinutes = minutes; } ans = Math.min(ans, t0Minutes + 1440 - preMinutes); // 首尾时间的时间差 return ans;    }    public int getMinutes(String t) { return ((t.charAt(0) - '0') * 10 + (t.charAt(1) - '0')) * 60 + (t.charAt(3) - '0') * 10 + (t.charAt(4) - '0');    }

c:

int cmp(const void *a, const void *b) {    return *(int *)a - *(int *)b;}int min(int a, int b) {    return a < b ? a : b;}int findMinDifference(char  timePoints, int timePointsSize){    int *ret = (int *) malloc( sizeof(int) * timePointsSize );    int i, ans = 1440;    int a, b;    for(i = 0; i < timePointsSize; ++i) { sscanf(timePoints[i], "%d:%d", &a, &b);      // (1) ret[i] = a * 60 + b;    // (2)    }    qsort(ret, timePointsSize, sizeof(int), cmp);    // (3)    for(i = 1; i < timePointsSize; ++i) { ans = min(ans, ret[i] - ret[i-1]);    // (4)    }    ans = min(ans, ret[0] - ret[timePointsSize-1] + 1440);  // (5)    return ans;}

🎯976. 三角形的最大周长

问题描述:给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。

🐾思路一:直接使用库函数

java:

public int largestPerimeter(int[] A) { Arrays.sort(A); for (int i = A.length - 1; i >= 2; --i) {     if (A[i - 2] + A[i - 1] > A[i]) {  return A[i - 2] + A[i - 1] + A[i];     } } return 0;    }

c:

int cmp(const void *a, const void *b) {    return *(int *)a - *(int *)b;}int largestPerimeter(int* nums, int numsSize){    int i;    qsort(nums, numsSize, sizeof(int), cmp);    for(i = numsSize-1; i >= 2; --i) { if(nums[i-2] + nums[i-1] > nums[i]) {// (1)     return nums[i-2] + nums[i-1] + nums[i]; }    }    return 0;}

🎯976. 三角形的最大周长

问题描述: 给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。

🐾思路一:直接使用库函数

java:

public int largestPerimeter(int[] A) { Arrays.sort(A); for (int i = A.length - 1; i >= 2; --i) {     if (A[i - 2] + A[i - 1] > A[i]) {  return A[i - 2] + A[i - 1] + A[i];     } } return 0;    }

c:

int cmp(const void *a, const void *b) {    return *(int *)a - *(int *)b;}int largestPerimeter(int* nums, int numsSize){    int i;    qsort(nums, numsSize, sizeof(int), cmp);    for(i = numsSize-1; i >= 2; --i) { if(nums[i-2] + nums[i-1] > nums[i]) {// (1)     return nums[i-2] + nums[i-1] + nums[i]; }    }    return 0;}

🎯881. 救生艇

问题描述:给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。

每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。

返回 承载所有人所需的最小船数 。

🐾思路一:直接使用库函数

java:

class Solution {    public int numRescueBoats(int[] people, int limit) { int res = 0; int right = people.length - 1; int left = 0; Arrays.sort(people); while (left <= right) {     if (left == right) {  res++;      // 只剩下最后一个,直接一个走,结束  break;     }     if (people[left] + people[right] > limit) {  res++;  right--; // 先载最重的, 而且最小的也无法一起载,那么就最重的单独走     }     else {  res++;  right--; // 最重的与最轻的一起走  left++;     } } return res;    }}

c:

int cmp(const void *a, const void *b) {    return *(int *)a - *(int *)b;}int numRescueBoats(int* people, int peopleSize, int limit){    int i;    int l = 0, r = peopleSize-1;    int ans = 0;    qsort(people, peopleSize, sizeof(int), cmp);     // (1)    while(l <= r) { if(l == r) {     ++ans; break;// (2) } else if(people[l] + people[r] > limit) {   // (3)     ++ans, r--; } else    // (4)     ++ans, ++l, --r;    }    return ans;}