📜个人简介 |
⭐️个人主页:摸鱼の文酱博客主页🙋♂️
🍑博客领域: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;
}