1. 程式人生 > >leetcode-24-exercise

leetcode-24-exercise

light 叠代 它的 i++ 檢查 tro ble 分享 clu

506. Relative Ranks

技術分享

解題思路:

使用priority_queue。它在插入時會將數據按照由大到小的順序插入,自然排序了。所以插入時考慮插入pair<nums[i],i>,然後根據i填充result。

註意,1) priority_queue沒有叠代器,所以要遍歷只能通過pop操作

2) vector要註意初始化,不然訪問時可能有問題

#include <queue>
class Solution {
public:
    vector<string> findRelativeRanks(vector<int>& nums) {
        vector<string> result(nums.size(), "");
        priority_queue<pair<int, int> > p;
        for (int i = 0; i < nums.size(); i++) {
            p.push(make_pair(nums[i], i));
        }
        int count = 0;
        while (p.empty() == false) {
            if (count == 0) {
                result[p.top().second] = "Gold Medal";
            }
            else if (count == 1) {
                result[p.top().second] = "Silver Medal";
            }
            else if (count == 2) {
                result[p.top().second] = "Bronze Medal";
            }
            else 
                result[p.top().second] = to_string(count + 1);
            p.pop();
            count ++;
        }
        return result;
    }
};

  


551. Student Attendance Record I

技術分享

解題思路:

這道題需要註意的是,L不能連續。所以只要看L的次數有沒有到2次就好了。如果1) i = 0; 2) s[i-1]不是L,s[i]是L,那麽設count=0。在循序中,

最後一條語句檢查A和L數目的情況。不要想復雜了,最簡單的方式解決就好。

bool checkRecord(string s) {
        int a = 0;
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == ‘A‘)
                a ++;
            if (s[i] == ‘L‘) {
                if (i == 0 || s[i-1] != ‘L‘)
                    count = 0;
                count ++;
            }
            if (a > 1 || count > 2)
                return false;
        }
        return true;
    }

  


556. Next Greater Element III

技術分享

解題思路:

首先,返回-1的有以下幾種情況:1) 只有一位數;2) 所有數字呈遞減順序,如9876這種;3) 轉換後的數超出INT_MAX

因此,先將數字轉化為字符串。然後從後往前,尋找遞減序列。假設從i到num.length()-1是遞減的,那麽,現將這一段倒序,

然後將num[i-1]與這一段中第一個大於它的數交換,即可。例如14653,653是遞減的,所以先變為14356,然後交換4和5,

變為15346。註意:最後要比較轉換後的數據和INT_MAX。考慮到是字符串比對,所以需要添加長度為10的條件,免得比較

時提前終止。

int nextGreaterElement(int n) {
        if (n < 10)
            return -1;
        string num = to_string(n);
        int i;
        for (i = num.length() - 1; i >= 1; i--) {
            if (num[i-1] < num[i])
                break;
        }
        // digits descends, no answer 
        if (i == 0)
            return -1;
        reverse(num.begin() + i, num.end());
        for (int j = i; j < num.length(); j++) {
            if (num[j] > num[i-1]) {
                char temp = num[j];
                num[j] = num[i-1];
                num[i-1] = temp;
                break;
            }
        }
        //cout << to_string(INT_MAX) << endl;
        // 2147483647
        if (num.size() == 10 && num > to_string(INT_MAX))
            return -1;
        return stoi(num);
    }

  


453. Minimum Moves to Equal Array Elements

技術分享

解題思路:

sum() - min*length

int minMoves(vector<int>& nums) {
        int min = nums[0];
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
            if (nums[i] < min)
                min = nums[i];
        }
        return sum - min * nums.size();
    }

  


414. Third Maximum Number

https://leetcode.com/problems/third-maximum-number/#/description

解題思路:

給數組排序,然後尋找第三個最大的。。如果沒有,返回最大值。

註意,因為開始時取了nums[n],遍歷時又從n開始,所以count只要數2就好了。

int thirdMax(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int third = nums[nums.size()-1];
        int count = 2;
        int max = third;
        for (int i = nums.size()-1; i >= 0; i--) {
            if (count > 0) {
                if (nums[i] < third){    
                    third = nums[i];
                    count --;
                }
                if (count == 0)
                    break;
            }
        }
        if (count != 0)
            return max;
        else
            return third;
    }

  


326. Power of Three

Given an integer, write a function to determine if it is a power of three.

Follow up:
Could you do it without using any loop / recursion?

解題思路:

先取以3為底的對數,然後乘方,看是否與原值相等。註意:1) 3^0 = 1

2) log是自然對數,要取3的要換底。獲得log(3,n)之後,要round,否則會WA在243那個值。。可能是精度原因。

bool isPowerOfThree(int n) {
        if (n == 1)
            return true;
        if (n < 3)
            return false;
        return abs(pow(3, round(log(n)/log(3))) - n) < 1e-15;
    }

367. Valid Perfect Square

Given a positive integer num, write a function which returns True if num is a perfect square else False.

Note: Do not use any built-in library function such as sqrt.

解題思路:

觀察:2^2 - 1^2 = 2*1+1

3^2 - 2^2 = 2*2+1

...

x^2 - (x-1)^2 = 2*(x-1)+1

所以一個數的平方可以分解為1+3+5+....所以,只需要驗證這個數是否為奇數和即可。

bool isPerfectSquare(int num) {
        int i = 1;
        while (num > 0) {
            num -= i;
            i += 2;
        }
        return num == 0;
    }

  


69. Sqrt(x)

Implement int sqrt(int x).

Compute and return the square root of x.

解題思路:

使用二分法。需要註意的是,left,right和mid要使用long,因為可能數值很大,超出int的範圍。

int mySqrt(int x) {
        if (x == 1)
            return x;
        // initiate as 0
        long left = 0;
        long right = x;
        long mid = left + (right - left) / 2;
        while (left + 1 < right) {
            if (mid * mid > x) 
                right = mid;
            else if (mid * mid < x)
                left = mid;
            else
                return mid;
            mid = left + (right - left) / 2;
        }
        // notice
        return left;
    }

  


  

leetcode-24-exercise