classSolution{public:intdivide(int x,int y){typedeflonglong LL;
vector<LL> exp;bool is_minus =false;if(x <0&& y >0|| x >0&& y <0) is_minus =true;
LL a =abs((LL)x), b =abs((LL)y);for(LL i = b; i <= a; i = i + i) exp.push_back(i);
LL res =0;for(int i = exp.size()-1; i >=0; i --)if(a >= exp[i]){
a -= exp[i];
res +=1ll<< i;}if(is_minus) res =-res;if(res > INT_MAX || res < INT_MIN) res = INT_MAX;return res;}};
# 方法1:递归classSolution:defdivide(self, dividend:int, divisor:int)->int:
MIN_INT, MAX_INT =-2147483648,2147483647# [−2**31, 2**31−1]
flag =1# 存储正负号,并将分子分母转化为正数if dividend <0: flag, dividend =-flag,-dividend
if divisor <0: flag, divisor =-flag,-divisor
defdiv(dividend, divisor):# 例:1023 / 1 = 512 + 256 + 128 + 64 + 32 + 16 + 8 + 4 + 1if dividend < divisor:return0
cur = divisor
multiple =1while cur + cur < dividend:# 用加法求出保证divisor * multiple <= dividend的最大multiple
cur += cur # 即cur分别乘以1, 2, 4, 8, 16...2^n,即二进制搜索
multiple += multiple
return multiple + div(dividend - cur, divisor)
res = div(dividend, divisor)
res = res if flag >0else-res # 恢复正负号if res < MIN_INT:# 根据是否溢出返回结果return MIN_INT
elif MIN_INT <= res <= MAX_INT:return res
else:return MAX_INT
# 方法2:迭代classSolution:defdivide(self, dividend:int, divisor:int)->int:
MIN_INT, MAX_INT =-2147483648,2147483647# [−2**31, 2**31−1]
flag =1# 存储正负号,并将分子分母转化为正数if dividend <0: flag, dividend =-flag,-dividend
if divisor <0: flag, divisor =-flag,-divisor
res =0while dividend >= divisor:# 例:1023 / 1 = 512 + 256 + 128 + 64 + 32 + 16 + 8 + 4 + 1
cur = divisor
multiple =1while cur + cur < dividend:# 用加法求出保证divisor * multiple <= dividend的最大multiple
cur += cur # 即cur分别乘以1, 2, 4, 8, 16...2^n,即二进制搜索
multiple += multiple
dividend -= cur
res += multiple
res = res if flag >0else-res # 恢复正负号if res < MIN_INT:# 根据是否溢出返回结果return MIN_INT
elif MIN_INT <= res <= MAX_INT:return res
else:return MAX_INT
funcdivide(dividend int, divisor int)int{
positive :=trueif dividend <0{
dividend =0- dividend
positive =!positive
}if divisor <0{
divisor =0- divisor
positive =!positive
}if divisor > dividend {return0}
res, mul_divisor :=1, divisor
for dividend > mul_divisor + mul_divisor {
res += res
mul_divisor += mul_divisor
}
res +=divide(dividend - mul_divisor, divisor)if!positive {
res =0- res
}if res >1<<31-1||0- res >1<<31{return1<<31-1}return res
}
第三十题:
struct QQ
{
vector<int> vec;int index =0;voidpush(int val){
vec.push_back(val);}intget(){int res = vec[index];
index =(index +1)% vec.size();return res;}};classSolution{public:
vector<int>findSubstring(string s, vector<string>& words){constint strSz = s.size(), wordSz = words[0].size(), n = words.size();if(strSz < wordSz){return{};}int i, j, jl, matched, need;
unordered_map<string_view, QQ> m;for(i =0; i < n;++i){
m[words[i]].push(i);}
vector<int>store(n,0);
string_view ss(s);
vector<int> res;for(i =0; i < wordSz;++i){
store.assign(n,0);
need = n;
matched =0;for(j =0, jl = strSz / wordSz; j < jl - need + matched +1;++j){auto itr = m.find(ss.substr(j * wordSz + i, wordSz));if(itr == m.end()){if(matched >0){
matched =0;
need = n;
store.assign(n,0);}continue;}int&k = store[itr->second.get()];++matched;if(k > need - n){
need = n + k;}elseif(matched == need){++need;
res.push_back(i + wordSz *(j - n +1));}
k = matched;}}return res;}};classSolution{public:
vector<int>findSubstring(string s, vector<string>& words){
vector<int> res;if(words.empty())return res;int n = s.size(), m = words.size(), w = words[0].size();
unordered_map<string,int> tot;for(auto& word : words) tot[word]++;for(int i =0; i < w; i ++){
unordered_map<string,int> wd;int cnt =0;for(int j = i; j + w <= n; j += w){if(j >= i + m * w){auto word = s.substr(j - m * w, w);
wd[word]--;if(wd[word]< tot[word]) cnt --;}auto word = s.substr(j, w);
wd[word]++;if(wd[word]<= tot[word]) cnt ++;if(cnt == m) res.push_back(j -(m -1)* w);}}return res;}};
public List<Integer>findSubstring(String s, String[] words){
List<Integer> res =newArrayList<Integer>();int wordNum = words.length;if(wordNum ==0){return res;}int wordLen = words[0].length();
HashMap<String, Integer> allWords =newHashMap<String, Integer>();for(String w : words){int value = allWords.getOrDefault(w,0);
allWords.put(w, value +1);}//将所有移动分成 wordLen 类情况for(int j =0; j < wordLen; j++){
HashMap<String, Integer> hasWords =newHashMap<String, Integer>();int num =0;//记录当前 HashMap2(这里的 hasWords 变量)中有多少个单词//每次移动一个单词长度for(int i = j; i < s.length()- wordNum * wordLen +1; i = i + wordLen){boolean hasRemoved =false;//防止情况三移除后,情况一继续移除while(num < wordNum){
String word = s.substring(i + num * wordLen, i +(num +1)* wordLen);if(allWords.containsKey(word)){int value = hasWords.getOrDefault(word,0);
hasWords.put(word, value +1);//出现情况三,遇到了符合的单词,但是次数超了if(hasWords.get(word)> allWords.get(word)){// hasWords.put(word, value);
hasRemoved =true;int removeNum =0;//一直移除单词,直到次数符合了while(hasWords.get(word)> allWords.get(word)){
String firstWord = s.substring(i + removeNum * wordLen, i +(removeNum +1)* wordLen);int v = hasWords.get(firstWord);
hasWords.put(firstWord, v -1);
removeNum++;}
num = num - removeNum +1;//加 1 是因为我们把当前单词加入到了 HashMap 2 中
i = i +(removeNum -1)* wordLen;//这里依旧是考虑到了最外层的 for 循环,看情况二的解释break;}//出现情况二,遇到了不匹配的单词,直接将 i 移动到该单词的后边(但其实这里//只是移动到了出现问题单词的地方,因为最外层有 for 循环, i 还会移动一个单词//然后刚好就移动到了单词后边)}else{
hasWords.clear();
i = i + num * wordLen;
num =0;break;}
num++;}if(num == wordNum){
res.add(i);}//出现情况一,子串完全匹配,我们将上一个子串的第一个单词从 HashMap2 中移除if(num >0&&!hasRemoved){
String firstWord = s.substring(i, i + wordLen);int v = hasWords.get(firstWord);
hasWords.put(firstWord, v -1);
num = num -1;}}}return res;}
classSolution:deffindSubstring(self, s:str, words: List[str])-> List[int]:ifnot words:return[]
w_len, s_len =len(words[0]),len(s)
t_len = w_len *len(words)# 子串的长度
word_dict ={}# words的哈希表for word in words:
word_dict[word]= word_dict.get(word,0)+1
ans =[]for offset inrange(w_len):
lo, lo_max = offset, s_len - t_len
while lo <= lo_max:
tmp_dict = word_dict.copy()
match =Truefor hi inrange(lo + t_len, lo,-w_len):# 从尾到头搜索单词
word = s[hi - w_len: hi]if word notin tmp_dict or tmp_dict.get(word,0)==0:
match =Falsebreak# 当前单词不符合要求 直接停止这个子串的搜索
tmp_dict[word]-=1if match:
ans.append(lo)
lo = hi # 对lo直接赋值 这就是相比法二优化的地方return ans
funcfindSubstring(s string, words []string)[]int{iflen(words)<1{return[]int{}}
slen :=len(s)
wlen :=len(words)
k :=len(words[0])if slen < k*wlen {return[]int{}}var res []intvar mp =make(map[string]int)for_, w :=range words {
mp[w]++}// 移动窗口减少重复检查单词,按单词长度取不同批次for i:=0; i<k; i++{var count intvar countermp =make(map[string]int)for l,r:=i,i; r<=slen-k; r=r+k {
word := s[r:r+k]if num, found := mp[word]; found {// 如果计数器中单词数目超标,左移指针直至符合数目要求for countermp[word]>= num {
countermp[s[l:l+k]]--
count--
l+=k
}
countermp[word]++
count++// fmt.Println(countermp, count)}else{// 如果当前单词不在词典里,左移指针至下一个单词,左移过程中清理计数for l<r {
countermp[s[l:l+k]]--
count--
l+=k
}
l+=k
}if count == wlen {
res =append(res, l)}}}return res
}
第三十一题:
classSolution{public:voidnextPermutation(vector<int>& nums){int k = nums.size()-1;while(k >0&& nums[k -1]>= nums[k]) k --;if(k <=0){reverse(nums.begin(), nums.end());}else{int t = k;while(t < nums.size()&& nums[t]> nums[k -1]) t ++;swap(nums[t -1], nums[k -1]);reverse(nums.begin()+ k, nums.end());}}};
classSolution{publicvoidnextPermutation(int[] nums){int i = nums.length -2;while(i >=0&& nums[i]>= nums[i +1]){
i--;}if(i >=0){int j = nums.length -1;while(j >=0&& nums[i]>= nums[j]){
j--;}swap(nums, i, j);}reverse(nums, i +1);}publicvoidswap(int[] nums,int i,int j){int temp = nums[i];
nums[i]= nums[j];
nums[j]= temp;}publicvoidreverse(int[] nums,int start){int left = start, right = nums.length -1;while(left < right){swap(nums, left, right);
left++;
right--;}}}
classSolution:defnextPermutation(self, nums: List[int])->None:
i =len(nums)-2while i >=0and nums[i]>= nums[i +1]:
i -=1if i >=0:
j =len(nums)-1while j >=0and nums[i]>= nums[j]:
j -=1
nums[i], nums[j]= nums[j], nums[i]
left, right = i +1,len(nums)-1while left < right:
nums[left], nums[right]= nums[right], nums[left]
left +=1
right -=1
funcnextPermutation(nums []int){
n :=len(nums)
i := n -2for i >=0&& nums[i]>= nums[i+1]{
i--}if i >=0{
j := n -1for j >=0&& nums[i]>= nums[j]{
j--}
nums[i], nums[j]= nums[j], nums[i]}reverse(nums[i+1:])}funcreverse(a []int){for i, n :=0,len(a); i < n/2; i++{
a[i], a[n-1-i]= a[n-1-i], a[i]}}
第三十二题:
classSolution{public:intlongestValidParentheses(string s){
stack<int> stk;int res =0;for(int i =0, start =-1; i < s.size(); i ++){if(s[i]=='(') stk.push(i);else{if(stk.size()){
stk.pop();if(stk.size()){
res =max(res, i - stk.top());}else{
res =max(res, i - start);}}else{
start = i;}}}return res;}};
publicclassSolution{publicintlongestValidParentheses(String s){int maxans =0;
Deque<Integer> stack =newLinkedList<Integer>();
stack.push(-1);for(int i =0; i < s.length(); i++){if(s.charAt(i)=='('){
stack.push(i);}else{
stack.pop();if(stack.empty()){
stack.push(i);}else{
maxans = Math.max(maxans, i - stack.peek());}}}return maxans;}}
funclongestValidParentheses(s string)int{
maxAns :=0
stack :=[]int{}
stack =append(stack,-1)for i :=0; i <len(s); i++{if s[i]=='('{
stack =append(stack, i)}else{
stack = stack[:len(stack)-1]iflen(stack)==0{
stack =append(stack, i)}else{
maxAns =max(maxAns, i - stack[len(stack)-1])}}}return maxAns
}funcmax(x, y int)int{if x > y {return x
}return y
}
classSolution:deflongestValidParentheses(self, s:str)->int:ifnot s:return0
stack =[]
ans =0for i inrange(len(s)):# 入栈条件ifnot stack or s[i]=='('or s[stack[-1]]==')':
stack.append(i)# 下标入栈else:# 计算结果
stack.pop()
ans =max(ans, i -(stack[-1]if stack else-1))return ans
第三十三题:
classSolution{public:intsearch(vector<int>& nums,int target){if(nums.empty())return-1;int l =0, r = nums.size()-1;while(l < r){int mid = l + r +1>>1;if(nums[mid]>= nums[0]) l = mid;else r = mid -1;}if(target >= nums[0]) l =0;else l = r +1, r = nums.size()-1;while(l < r){int mid = l + r >>1;if(nums[mid]>= target) r = mid;else l = mid +1;}if(nums[r]== target)return r;return-1;}};
classSolution{publicintsearch(int[] nums,int target){int n = nums.length;if(n ==0){return-1;}if(n ==1){return nums[0]== target ?0:-1;}int l =0, r = n -1;while(l <= r){int mid =(l + r)/2;if(nums[mid]== target){return mid;}if(nums[0]<= nums[mid]){if(nums[0]<= target && target < nums[mid]){
r = mid -1;}else{
l = mid +1;}}else{if(nums[mid]< target && target <= nums[n -1]){
l = mid +1;}else{
r = mid -1;}}}return-1;}}
classSolution:defsearch(self, nums: List[int], target:int)->int:ifnot nums:return-1
l, r =0,len(nums)-1while l <= r:
mid =(l + r)//2if nums[mid]== target:return mid
if nums[0]<= nums[mid]:if nums[0]<= target < nums[mid]:
r = mid -1else:
l = mid +1else:if nums[mid]< target <= nums[len(nums)-1]:
l = mid +1else:
r = mid -1return-1
funcsearch(nums []int, target int)int{
low,high:=0,len(nums)-1for low < high -1{
mid:=(high+low)/2
a,b,c:=nums[low],nums[mid],nums[high]if b == target{return mid
}switch{// 上面两个case在递增序列找同二分查找case target>=a && target<=b:
high = mid
case target>=b && target<=c:
low = mid
// 如果在递增的区间没有找到// 那么只可能在递减的区间中// 由于是旋转数组,只可能有一个递减区间case a>b:
high = mid
case b>c:
low = mid
default:return-1}}if nums[low]== target{return low
}if nums[high]== target{return high
}return-1}
第三十四题:
classSolution{public:
vector<int>searchRange(vector<int>& nums,int target){if(nums.empty())return{-1,-1};int l =0, r = nums.size()-1;while(l < r){int mid = l + r >>1;if(nums[mid]>= target) r = mid;else l = mid +1;}if(nums[r]!= target)return{-1,-1};int L = r;
l =0, r = nums.size()-1;while(l < r){int mid = l + r +1>>1;if(nums[mid]<= target) l = mid;else r = mid -1;}return{L, r};}};
classSolution{publicint[]searchRange(int[] nums,int target){int leftIdx =binarySearch(nums, target,true);int rightIdx =binarySearch(nums, target,false)-1;if(leftIdx <= rightIdx && rightIdx < nums.length && nums[leftIdx]== target && nums[rightIdx]== target){returnnewint[]{leftIdx, rightIdx};}returnnewint[]{-1,-1};}publicintbinarySearch(int[] nums,int target,boolean lower){int left =0, right = nums.length -1, ans = nums.length;while(left <= right){int mid =(left + right)/2;if(nums[mid]> target ||(lower && nums[mid]>= target)){
right = mid -1;
ans = mid;}else{
left = mid +1;}}return ans;}}
from typing import List
classSolution:defsearchRange(self, nums: List[int], target:int)-> List[int]:
size =len(nums)if size ==0:return[-1,-1]
first_position = self.__find_first_position(nums, size, target)if first_position ==-1:return[-1,-1]
last_position = self.__find_last_position(nums, size, target)return[first_position, last_position]def__find_first_position(self, nums, size, target):
left =0
right = size -1while left < right:
mid =(left + right)//2if nums[mid]< target:
left = mid +1elif nums[mid]== target:
right = mid
else:# nums[mid] > target
right = mid -1if nums[left]== target:return left
else:return-1def__find_last_position(self, nums, size, target):
left =0
right = size -1while left < right:
mid =(left + right +1)//2if nums[mid]> target:
right = mid -1elif nums[mid]== target:
left = mid
else:# nums[mid] < target
left = mid +1# 由于能走到这里,说明在数组中一定找得到目标元素,因此这里不用再做一次判断return left
第三十五题:
classSolution{public:intsearchInsert(vector<int>& nums,int target){int l =0, r = nums.size();while(l < r){int mid = l + r >>1;if(nums[mid]>= target) r = mid;else l = mid +1;}return l;}};
classSolution{publicintsearchInsert(int[] nums,int target){int n = nums.length;int left =0, right = n -1, ans = n;while(left <= right){int mid =((right - left)>>1)+ left;if(target <= nums[mid]){
ans = mid;
right = mid -1;}else{
left = mid +1;}}return ans;}}
funcsearchInsert(nums []int, target int)int{
n :=len(nums)
left, right :=0, n -1
ans := n
for left <= right {
mid :=(right - left)>>1+ left
if target <= nums[mid]{
ans = mid
right = mid -1}else{
left = mid +1}}return ans
}
classSolution:defsearchInsert(self, nums: List[int], target:int)->int:
left,right=0,len(nums)while left<right:
mid=left+(right-left)//2if nums[mid]<target:
left = mid+1else:
right = mid
return left