剑指 Offer II 001. 整数除法
int divide(int a, int b) {
bool flag=false;
if(b==INT_MAX){
if(a==INT_MIN||a==-INT_MAX) return -1;
if(a==INT_MAX) return 1;
else return 0;
}
if(b==INT_MIN) {
if(a==INT_MIN) return 1;
else return 0;
}
if(a==INT_MAX){
if(b==INT_MAX) return 1;
if(b==1) return a;
if(b==-1) return -a;
}
if(a==INT_MIN) {
if(b==INT_MIN) return 1;
if(b==1) return a;
if(b==-1) return pow(2,31)-1;
}
if((a<0&&b<0)||(a>0&&b>0)) flag=true;
else flag=false;
if(a==0) return 0;
if(a==b) return 1;
long aa=abs(a),ja=abs(a) ,jb=abs(b),bb=abs(b);
long cnt=1;
int scnt=cnt,sbb=bb;
while(bbpow(2,31)-1) return pow(2,31)-1;
return cnt-1;
}
else{
return -(cnt-1);
}
}
剑指 Offer II 002. 二进制加法
string addBinary(string a, string b) {
if(a.size() aa(a.size(),0),bb(a.size(),0);
for(int i=a.size()-1,j=0;i>=0;i--,j++) aa[j]=a[i]-'0';
for(int i=b.size()-1,j=0;i>=0;i--,j++) bb[j]=b[i]-'0';
int cnt=0;
for(int i=0;i
剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
位运算:
int lowbit(int n){
return n&-n;//返回最后一个1例如:10->1010 返回2。
}
vector countBits(int n) {
vector res;
for(int i=0;i<=n;i++){
int cnt=0;
int kk=i;
while(kk) cnt++,kk-=lowbit(kk);
res.push_back(cnt);
}
return res;
}
dp:偶数的1的个数等于偶数/2的个数,奇数的个数等于上一个偶数的个数+1;
vector countBits(int n) {
vector res(n,0);
res.push_back(0);
for(int i=1;i<=n;i++){
if(i%2==1) res[i]=res[i-1]+1;
else res[i]=res[i/2];
}
return res;
}
剑指 Offer II 004. 只出现一次的数字
int singleNumber(vector& nums) {
unordered_map map;
for(int i=0;i
剑指 Offer II 005. 单词长度的最大乘积
int maxProduct(vector& words) {
int res=0;
int f[words.size()][26];
memset(f,0,sizeof(f));
for(int i=0;i
剑指 Offer II 006. 排序数组中两个数字之和
vector twoSum(vector& nums, int target) {
vector res;
for(int i=0,j=nums.size()-1;ii&&nums[i]+nums[j]>target) j--;
if(nums[i]+nums[j]==target){
res.push_back(i),res.push_back(j);
break;
}
}
return res;
}
剑指 Offer II 007. 数组中和为 0 的三个数
vector> threeSum(vector& nums) {
vector> res;
sort(nums.begin(),nums.end());
for(int i=0;ij&&nums[i]+nums[j]+nums[k]>0) k--;
if(k>j&&nums[i]+nums[j]+nums[k]==0){
vector xx;
xx.push_back(nums[i]),xx.push_back(nums[j]),xx.push_back(nums[k]);
res.push_back(xx);
}
}
}
//res.erase(unique(res.begin(),res.end()),res.end());
return res;
}
剑指 Offer II 008. 和大于等于 target 的最短子数组
滑动窗口优化版:
int minSubArrayLen(int target, vector& nums) {
int res=INT_MAX;
int sum=nums[0];
if(nums[0]>=target) return 1;
for(int i=0,j=1;i=target) res=min(res,j-i),sum-=nums[i],i++;
if(j==nums.size()&&sum
剑指 Offer II 009. 乘积小于 K 的子数组
int numSubarrayProductLessThanK(vector& nums, int k) {
int res=0,p=1;
for(int i=0,j=0;j=k) p/=nums[i++];
res+=j-i+1;
}
return res;
}
剑指 Offer II 010. 和为 k 的子数组
int subarraySum(vector& nums, int k) {
unordered_map>map;
int res=0;
int sum[nums.size()];
sum[0]=nums[0];
if(nums[0]==k) res++;
map[sum[0]].push_back(0);
for(int i=1;ixx= map[sum[i]-k];
if(!xx.empty()){
for(int j=0;j
剑指 Offer II 011. 0 和 1 个数相同的子数组
int findMaxLength(vector& nums) {
int s[nums.size()+1];
unordered_mapmap;
int res=0;
map[0]=0;
for(int i=1,one=0,zero=0;i<=nums.size();i++){
if(nums[i-1]==1) one++;
else zero++;
int s=one-zero;
if(map.count(s)!=0) res=max(res,i-map[s]);
else map[s]=i;
}
return res;
}
剑指 Offer II 012. 左右两边子数组的和相等
int pivotIndex(vector& nums) {
int n=nums.size();
int s[nums.size()];
s[0]=nums[0];
for(int i=1;i
剑指 Offer II 013. 二维子矩阵的和
int sum[200][200];
NumMatrix(vector>& matrix) {
memset(sum,0,sizeof(sum));
sum[0][0]=matrix[0][0];
for(int i=0;i
剑指 Offer II 014. 字符串中的变位词
bool checkInclusion(string s1, string s2) {
unordered_mapmap;
long cnt=0;
for(int i=0;i
滑动窗口优化后(基本双百):
bool checkInclusion(string s1, string s2) {
int f[26]={0};
for(int i=0;i0) --f[s2[i]-'a'], i++;
if(j-i+1==s1.size()) return true;
}
return false;
}
剑指 Offer II 015. 字符串中的所有变位词
vector findAnagrams(string s, string p) {
vector res;
int f[26];
//memset(f,0,sizeof(f));
int sz=s.size(),pz=p.size();
for(int i=0;i0) --f[s[i]-'a'],i++;
if(j-i+1==pz) res.push_back(i);
}
return res;
}
剑指 Offer II 016. 不含重复字符的最长子字符串
int lengthOfLongestSubstring(string s) {
if(s.size()==0) return 0;
int f[200];
int res=0;
memset(f,0,sizeof(f));
for(int i=0,j=0;j1) --f[s[i]],i++;
res=max(res,j-i+1);
}
return res;
}
剑指 Offer II 017. 含有所有字符的最短字符串
string minWindow(string s, string t) {
set st;
unordered_map map1,map2;
for(int i=0;ij-i+1){
res=j-i+1;
l=i,r=j;
}
--map2[s[i]];
if(map1.count(s[i])&&map2[s[i]]+1==map1[s[i]]){
cnt--;
}
i++;
}
}
if(res==INT_MAX) return "";
return s.substr(l,r-l+1);
}
剑指 Offer II 018. 有效的回文
bool isPalindrome(string s) {
if(s.size()<=1) return true;
string str;
for(int i=0;i='a'&&s[i]<='z') str+=s[i];
if(s[i]>='0'&&s[i]<='9') str+=s[i];
if(s[i]>='A'&&s[i]<='Z') str+=(s[i]+32);
}
for(int i=0;i<=str.size()/2;i++){
if(str.size()==0)break;
if(str[i]!=str[str.size()-1-i]) return false;
}
return true;
}
剑指 Offer II 019. 最多删除一个字符得到回文
bool check(string str){
for(int i=0;i<=str.size()/2;i++){
if(str[i]!=str[str.size()-i-1]) return false;
}
return true;
}
bool validPalindrome(string s) {
int l=0,r=0;
bool flag=true;
for(int i=0,j=s.size()-1;i<=s.size()/2;i++,j--){
if(s[i]!=s[j]){
l=i;r=j;
flag=false;
break;
}
}
if(flag) return true;
int len=s.size();
string str1=s.substr(0,l)+s.substr(l+1,len-(l+1)+1);
string str2=s.substr(0,r)+s.substr(r+1,len-(r+1)+1);
if(check(str1)||check(str2)) return true;
else return false;
}
剑指 Offer II 020. 回文子字符串的个数
int countSubstrings(string s) {
bool f[1010][1010];
memset(f,false,sizeof(f));
int res=0;
int n=s.size();
for(int i=n-1;i>=0;i--){
for(int j=i;j<=n;j++){
if(i==j) f[i][j]=true, res++;
if(j-i==1&&s[i]==s[j]) f[i][j]=true,res++;
if(j-i>1&&f[i+1][j-1]&&s[i]==s[j])f[i][j]=true, res++;
}
}
return res;
}