leetcode-24-exercise
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