从最小开始
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int cnt = 0;
sort(g.begin(),g.end());
sort(s.begin(),s.end());
for(int i=0,j=0;i<g.size() && j<s.size();j++){
if(s[j] >= g[i]){
cnt++;
i++;
}
}
return cnt;
}
};
从最大开始
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int cnt = 0;
sort(g.rbegin(),g.rend());
sort(s.rbegin(),s.rend());
for(int i=0,j=0;i<g.size() && j<s.size();i++){
if(s[j] >= g[i]){
cnt++;
j++;
}
}
return cnt;
}
};
贪心解法
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() <= 1) return nums.size();
int curDiff = 0; // 当前一对差值
int preDiff = 0; // 前一对差值
int result = 1; // 记录峰值个数,序列默认序列最右边有一个峰值
for (int i = 0; i < nums.size() - 1; i++) {
curDiff = nums[i + 1] - nums[i];
// 出现峰值
if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
result++;
preDiff = curDiff; // 注意这里,只在摆动变化的时候更新prediff
}
}
return result;
}
};
普通解法
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() < 2)
return nums.size();
int max = 1,i = 1;
while(i<nums.size() && nums[i] == nums[i-1])
i++;
if(i >= nums.size())
return max;
bool flag = nums[i-1]<nums[i];
max++;
i++;
for(;i < nums.size();i++){
if(flag && nums[i-1] > nums[i]){
max++;
flag = false;
}else if(flag == false && nums[i-1] < nums[i]){
max++;
flag = true;
}
}
return max;
}
};
贪心解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 0)
return 0;
int max = INT_MIN;
int sum = 0;
for(int i = 0;i < nums.size();i++){
sum += nums[i];
if(sum > max){
max = sum;
}
if(sum < 0){
sum = 0;
}
}
return max;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit = 0;
for(int i=1;i<prices.size();i++){
if(prices[i] > prices[i-1])
profit += prices[i]-prices[i-1];
}
return profit;
}
};
回溯超时
class Solution {
public:
bool backtracking(vector<int> nums,int i){
if(i >= nums.size()-1)
return true;
for(int j = nums[i];j > 0;j--){
if(backtracking(nums,i+j)){
return true;
}
}
return false;
}
bool canJump(vector<int>& nums) {
return backtracking(nums,0);
}
};
贪心
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover = 0;
for(int i = 0;i < nums.size();i++){
if(cover < i)
return false;
cover = max(cover,i + nums[i]);
if(cover >= nums.size())
return true;
}
return true;
}
};
class Solution {
public:
int jump(vector<int>& nums) {
int cur = 0,next = 0,ans = 0;
for(int i = 0;i < nums.size()-1;i++){
next = max(next,nums[i]+i);
if(i == cur){
cur = next;
ans++;
}
}
return ans;
}
};
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int sum = 0;
for(int i = 0;i < nums.size() && k > 0;i++){
if(nums[i] < 0){
nums[i] = -nums[i];
k--;
}
}
for(int i=0;i<nums.size();i++){
sum += nums[i];
}
sort(nums.begin(),nums.end());
if(k % 2){
sum -= nums[0]*2;
}
return sum;
}
};
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
int curgas = 0, totalgas = 0;
int start = 0;
for(int i = 0; i < n; i++){
curgas += gas[i] - cost[i];
totalgas += gas[i] - cost[i];
if(curgas < 0){
start = i + 1;
curgas = 0;
}
}
if(totalgas < 0)
return -1;
return start;
}
};
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> candy(ratings.size(),1);
for(int i = 1;i < ratings.size();i++){
if(ratings[i-1] < ratings[i]){
candy[i] = candy[i-1] + 1;
}
}
for(int i = ratings.size() - 1;i > 0;i--){
if(ratings[i-1] > ratings[i]){
candy[i-1] = max(candy[i] + 1,candy[i-1]);
}
}
int sum = 0;
for(int i = 0;i < candy.size();i++){
sum += candy[i];
}
return sum;
}
};
直接在原有数组中调整
class Solution {
public:
static bool cmp(vector<int> p1,vector<int> p2){
if(p1[0] == p2[0])
return p1[1] < p2[1];
return p1[0] > p2[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(),people.end(),cmp);
for(int i = 0; i < people.size(); i++){
int pos = people[i][1];
if(pos < i){
vector<int> vec = people[i];
for(int j = i-1; j >= pos; j--){
people[j+1] = people[j];
}
people[pos] = vec;
}
}
return people;
}
};
新数组
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort (people.begin(), people.end(), cmp);
vector<vector<int>> que;
for (int i = 0; i < people.size(); i++) {
int position = people[i][1];
que.insert(que.begin() + position, people[i]);
}
return que;
}
};
优化
class Solution {
public:
// 身高从大到小排(身高相同k小的站前面)
static bool cmp(const vector<int>& a, const vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort (people.begin(), people.end(), cmp);
list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多
for (int i = 0; i < people.size(); i++) {
int position = people[i][1]; // 插入到下标为position的位置
std::list<vector<int>>::iterator it = que.begin();
while (position--) { // 寻找在插入位置
it++;
}
que.insert(it, people[i]);
}
return vector<vector<int>>(que.begin(), que.end());
}
};