11-盛最多水的容器
思路:定义2个指针分别指向数组的两端,找出两边缘最小的那个,然后乘以两边缘的距离,然后向中间搜索,移动一次算出结果比较取最大的。
class Solution { public: int maxArea(vector<int>& height) { int res=0,i=0,j=height.size()-1; while(i<j){ int h=min(height[j],height[i]); res = max(res,h*(j-i)); while(i<j&&h==height[i]) i++; while(i<j&&h==height[j]) j--; } return res; } };
455-分发饼干
思路:可以先对两个数组进行排序,然后从小到大来一一对应,res+1,第二个数组发现不能满足第一个数组的时候逐步+1,然后用该数组后面的数字来对比。
class Solution { public: int findContentChildren(vector<int>& g, vector<int>& s) { sort(g.begin(),g.end(),greater<int>()); sort(s.begin(),s.end(),greater<int>()); int gi=0,si=0,res=0; while(gi<g.size()&&si<s.size()){ if(s[si]>=g[gi]){ res++; gi++; si++; } else gi++; } return res; } };
392-判断子序列
思路:目前想到的就是两个字符串对比,从前往后遍历一遍,遇到相同的就自增1,逐步遍历一遍后看i是否等于s的长度,且字符都在t中出现过。
class Solution { public: bool isSubsequence(string s, string t) { int i=0; for(int j=0;j<t.size()&&i<s.size();j++){ if(s[i]==t[j]) i++; } return i==s.size(); } };
435-无重叠区
思路:先更据每个区间的start进行升序排序,然后更据前一个区间的end是否大于后一个区间的start来进行判断,是则res+1,然后将last指向end值较小的那个区间,没有则指向当前,然后继续遍历。
class Solution { public: int eraseOverlapIntervals(vector<vector<int>>& intervals) { int res = 0, n = intervals.size(), last = 0; sort(intervals.begin(), intervals.end()); for (int i = 1; i < n; ++i) { if (intervals[i][0] < intervals[last][1]) { ++res; if (intervals[i][1] < intervals[last][1]) last = i; } else { last = i; } } return res; } };
402
55
12
13