338. 比特位计数
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
class Solution {
public:
vector<int> countBits(int n) {
vector<int> bits(n + 1);
for(int i=0;i<=n;i++)
{
bits[i]=bits[i/2]+i%2;
}
return bits;
}
};
20. 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(int i=0;i<s.size();i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{')
st.push(s[i]);
else {
if(st.empty()) return false;//第一次没过的例子是"]"
auto c=st.top();
if(s[i]==')' && c=='(' || s[i]==']' && c=='[' || s[i]=='}'&& c=='{')
st.pop();
else
return false;
}
}
if(st.empty()) return true;
else return false;
}
};
56. 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
排序+贪心
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() == 0) {
return {};
}
sort(intervals.begin(), intervals.end());//按照左端点升序排序
vector<vector<int>> merged;
merged.push_back(intervals[0]);
for(int i=1;i<intervals.size();i++){
int n=merged.size();
if(intervals[i][1]>=merged[n-1][1] && intervals[i][0]<=merged[n-1][1]) {
merged[n-1]={merged[n-1][0],intervals[i][1]};
}
else if(intervals[i][1]<=merged[n-1][1]) continue;
else if(intervals[i][0]>merged[n-1][1]) merged.push_back({intervals[i][0],intervals[i][1]});
}
return merged;
}
};
75. 颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int ptr = 0;
for (int i = 0; i < n; ++i) {
if (nums[i] == 0) {
swap(nums[i], nums[ptr]);
++ptr;
}
}
//ptr之前的全为0
for (int i = ptr; i < n; ++i) {
if (nums[i] == 1) {
swap(nums[i], nums[ptr]);
++ptr;
}
}
//ptr之前的全为1
}
};
16. 最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2:
输入:nums = [0,0,0], target = 1
输出:0
和前面的15.三个数之和 思路一样,先sort再双指针
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int n=nums.size();
int l,r,minn=1e5,res;
for(int i=0;i<n-2;i++){
l=i+1;
r=n-1;
while(l<r){
int tmp=abs(nums[i]+nums[l]+nums[r]-target);
if (minn>tmp){
minn=tmp;res=nums[i]+nums[l]+nums[r];
}
if(nums[i]+nums[l]+nums[r]>target) r--;
else if(nums[i]+nums[l]+nums[r]<target) l++;
else
return target;
}
}
return res;
}
};