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; }