【今日打卡】《LeetCode零基础指南》(第六讲) C排序API

问题描述:

坚持就是胜利!

1.

给你一个整数数组 nums,请你将该数组升序排列。

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        return nums;
    }
};

2.

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort (nums.begin(),nums.end());
        return nums[nums.size()/2];
    }
};

3.

给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> s;
        for (int x: nums) {
            if (s.count(x)) {
                return true;
            }
            s.insert(x);
        }
        return false;
    }
};

4.

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

class Solution {
public:
    int maximumGap(vector<int>& nums) {
        if (nums.size()<2) return 0;
        sort(nums.begin(),nums.end());
        int max=0;
        for (int i=0;i<nums.size()-1;i++){
            max=max>nums[i+1]-nums[i]?max:nums[i+1]-nums[i];
        }
        return max;
    }
};

5.

给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        int i=0,j=nums.size()-1;
        while (i<j){
            if ((nums[i]&1)==0) i++;
            else if ((nums[j]&1)==1) j--;
            else {
                swap(nums[i],nums[j]);
            }
        }
        return nums;
    }
};

6.

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

class Solution {
public:
    int getminutes (string a){
        int h = (a[0]-48)*10+a[1]-48;
        int min= (a[3]-48)*10+a[4]-48;
        int res= 60*h+min;
        return res;
    }
    int findMinDifference(vector<string>& timePoints) {
        int minutes [timePoints.size()+1];
        for (int i=0;i<timePoints.size();i++){
            minutes[i]=getminutes(timePoints[i]);
        }
        sort (minutes,minutes+timePoints.size());
        minutes[timePoints.size()]=minutes[0];
        int minD=1440;
        for (int i=0;i<timePoints.size();i++){
            int dif=min(abs(minutes[i]-minutes[i+1]),abs(1440-minutes[i]+minutes[i+1]));
            minD=minD<dif?minD:dif;
        }
        return minD;
    }
};

7.

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

class Solution {
public:
    int largestPerimeter(vector<int>& nums) {
        sort (nums.begin(),nums.end());
        int a=nums.size()-3;
        while (a>=0){
            if (nums[a]+nums[a+1]>nums[a+2]) return nums[a]+nums[a+1]+nums[a+2];
            else {
                a--;
            }
        }
        return 0;
    }
};

8.

第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回载到每一个人所需的最小船数。(保证每个人都能被船载)。

class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        sort (people.begin(),people.end());
        int i=0,j=people.size()-1;
        int ans = j+1;
        if (i==j) return ans;
        while (i<j){
            int max = limit-people[i];
            if (people[j]>max) j--;
            else {
                j--;
                i++;
                ans--;
            }
        }
        return ans;
    }
};