classSolution{public:intlargestRectangleArea(vector<int>& h){int n = h.size();
vector<int>left(n),right(n);
stack<int> stk;for(int i =0; i < n; i ++){while(stk.size()&& h[stk.top()]>= h[i]) stk.pop();if(stk.empty()) left[i]=-1;else left[i]= stk.top();
stk.push(i);}
stk = stack<int>();for(int i = n -1; i >=0; i --){while(stk.size()&& h[stk.top()]>= h[i]) stk.pop();if(stk.empty()) right[i]= n;else right[i]= stk.top();
stk.push(i);}int res =0;for(int i =0; i < n; i ++){
res =max(res, h[i]*(right[i]- left[i]-1));}return res;}intmaximalRectangle(vector<vector<char>>& matrix){if(matrix.empty()|| matrix[0].empty())return0;int n = matrix.size(), m = matrix[0].size();
vector<vector<int>>h(n, vector<int>(m));for(int i =0; i < n; i ++)for(int j =0; j < m; j ++){if(matrix[i][j]=='1'){if(i) h[i][j]=1+ h[i -1][j];else h[i][j]=1;}}int res =0;for(int i =0; i < n; i ++) res =max(res,largestRectangleArea(h[i]));return res;}};
classSolution{publicintmaximalRectangle(char[][] matrix){int m = matrix.length;if(m ==0){return0;}int n = matrix[0].length;int[][] left =newint[m][n];for(int i =0; i < m; i++){for(int j =0; j < n; j++){if(matrix[i][j]=='1'){
left[i][j]=(j ==0?0: left[i][j -1])+1;}}}int ret =0;for(int j =0; j < n; j++){// 对于每一列,使用基于柱状图的方法int[] up =newint[m];int[] down =newint[m];
Deque<Integer> stack =newLinkedList<Integer>();for(int i =0; i < m; i++){while(!stack.isEmpty()&& left[stack.peek()][j]>= left[i][j]){
stack.pop();}
up[i]= stack.isEmpty()?-1: stack.peek();
stack.push(i);}
stack.clear();for(int i = m -1; i >=0; i--){while(!stack.isEmpty()&& left[stack.peek()][j]>= left[i][j]){
stack.pop();}
down[i]= stack.isEmpty()? m : stack.peek();
stack.push(i);}for(int i =0; i < m; i++){int height = down[i]- up[i]-1;int area = height * left[i][j];
ret = Math.max(ret, area);}}return ret;}}
funcmaximalRectangle(matrix [][]byte)(ans int){iflen(matrix)==0{return}
m, n :=len(matrix),len(matrix[0])
left :=make([][]int, m)for i, row :=range matrix {
left[i]=make([]int, n)for j, v :=range row {if v =='0'{continue}if j ==0{
left[i][j]=1}else{
left[i][j]= left[i][j-1]+1}}}for j :=0; j < n; j++{// 对于每一列,使用基于柱状图的方法
up :=make([]int, m)
down :=make([]int, m)
stk :=[]int{}for i, l :=range left {forlen(stk)>0&& left[stk[len(stk)-1]][j]>= l[j]{
stk = stk[:len(stk)-1]}
up[i]=-1iflen(stk)>0{
up[i]= stk[len(stk)-1]}
stk =append(stk, i)}
stk =nilfor i := m -1; i >=0; i--{forlen(stk)>0&& left[stk[len(stk)-1]][j]>= left[i][j]{
stk = stk[:len(stk)-1]}
down[i]= m
iflen(stk)>0{
down[i]= stk[len(stk)-1]}
stk =append(stk, i)}for i, l :=range left {
height := down[i]- up[i]-1
area := height * l[j]
ans =max(ans, area)}}return}funcmax(a, b int)int{if a > b {return a
}return b
}
classSolution:defmaximalRectangle(self, matrix: List[List[str]])->int:ifnot matrix:return0
m,n=len(matrix),len(matrix[0])# 记录当前位置上方连续“1”的个数
pre=[0]*(n+1)
res=0for i inrange(m):for j inrange(n):# 前缀和
pre[j]=pre[j]+1if matrix[i][j]=="1"else0# 单调栈
stack=[-1]for k,num inenumerate(pre):while stack and pre[stack[-1]]>num:
index=stack.pop()
res=max(res,pre[index]*(k-stack[-1]-1))
stack.append(k)return res
classSolution{public ListNode partition(ListNode head,int x){
ListNode small =newListNode(0);
ListNode smallHead = small;
ListNode large =newListNode(0);
ListNode largeHead = large;while(head != null){if(head.val < x){
small.next = head;
small = small.next;}else{
large.next = head;
large = large.next;}
head = head.next;}
large.next = null;
small.next = largeHead.next;return smallHead.next;}}
funcpartition(head *ListNode, x int)*ListNode {
small :=&ListNode{}
smallHead := small
large :=&ListNode{}
largeHead := large
for head !=nil{if head.Val < x {
small.Next = head
small = small.Next
}else{
large.Next = head
large = large.Next
}
head = head.Next
}
large.Next =nil
small.Next = largeHead.Next
return smallHead.Next
}
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = NoneclassSolution:defpartition(self, head: ListNode, x:int)-> ListNode:
dummy1 = ListNode(-1)
dummy2 = ListNode(-1)
p1 = dummy1
p2 = dummy2
while head:if head.val < x:
p1.next= head
p1 = p1.nextelse:
p2.next= head
p2 = p2.next
head = head.next# print(listNodeToString(dummy1.next))# print(listNodeToString(dummy2.next))
p1.next= dummy2.next
p2.next=Nonereturn dummy1.next
第八十七题:
classSolution{public:boolisScramble(string s1, string s2){if(s1 == s2)returntrue;
string bs1 = s1, bs2 = s2;sort(bs1.begin(), bs1.end()),sort(bs2.begin(), bs2.end());if(bs1 != bs2)returnfalse;int n = s1.size();for(int i =1; i <= n -1; i ++){if(isScramble(s1.substr(0, i), s2.substr(0, i))&&isScramble(s1.substr(i), s2.substr(i)))returntrue;if(isScramble(s1.substr(0, i), s2.substr(n - i))&&isScramble(s1.substr(i), s2.substr(0, n - i)))returntrue;}returnfalse;}};
classSolution{publicbooleanisScramble(String s1, String s2){char[] chs1 = s1.toCharArray();char[] chs2 = s2.toCharArray();int n = s1.length();int m = s2.length();if(n != m){returnfalse;}boolean[][][] dp =newboolean[n][n][n +1];// 初始化单个字符的情况for(int i =0; i < n; i++){for(int j =0; j < n; j++){
dp[i][j][1]= chs1[i]== chs2[j];}}// 枚举区间长度 2~nfor(int len =2; len <= n; len++){// 枚举 S 中的起点位置for(int i =0; i <= n - len; i++){// 枚举 T 中的起点位置for(int j =0; j <= n - len; j++){// 枚举划分位置for(int k =1; k <= len -1; k++){// 第一种情况:S1 -> T1, S2 -> T2if(dp[i][j][k]&& dp[i + k][j + k][len - k]){
dp[i][j][len]=true;break;}// 第二种情况:S1 -> T2, S2 -> T1// S1 起点 i,T2 起点 j + 前面那段长度 len-k ,S2 起点 i + 前面长度kif(dp[i][j + len - k][k]&& dp[i + k][j][len - k]){
dp[i][j][len]=true;break;}}}}}return dp[0][0][n];}}
var primeNumber =[]int{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101}funcisScramble(s1 string, s2 string)bool{<!-- 进来先判断字符串是否包含相同字节,节省了非常多时间 -->if!containSame(s1, s2){returnfalse}
sl :=len(s1)if sl <=3{<!-- 原本把 containSame(s1, s2) 判断写在这里的,时间慢非常多-->returntrue}for i :=1; i < sl; i++{ifisScramble(s1[:i], s2[:i])&&isScramble(s1[i:], s2[i:]){returntrue}ifisScramble(s1[:i], s2[sl-i:])&&isScramble(s1[i:], s2[:sl-i]){returntrue}}returnfalse}funccontainSame(s1 string, s2 string)bool{
sum :=1
sum2 :=1for i :=0; i <len(s1); i++{
sum *= primeNumber[s1[i]-97]
sum2 *= primeNumber[s2[i]-97]}if sum == sum2 {returntrue}returnfalse}
第八十八题:
classSolution{public:voidmerge(vector<int>& nums1,int m, vector<int>& nums2,int n){int k = n + m -1;int i = m -1, j = n -1;while(i >=0&& j >=0)if(nums1[i]>= nums2[j]) nums1[k --]= nums1[i --];else nums1[k --]= nums2[j --];while(j >=0) nums1[k --]= nums2[j --];}};
classSolution{publicvoidmerge(int[] nums1,int m,int[] nums2,int n){// Make a copy of nums1.int[] nums1_copy =newint[m];
System.arraycopy(nums1,0, nums1_copy,0, m);// Two get pointers for nums1_copy and nums2.int p1 =0;int p2 =0;// Set pointer for nums1int p =0;// Compare elements from nums1_copy and nums2// and add the smallest one into nums1.while((p1 < m)&&(p2 < n))
nums1[p++]=(nums1_copy[p1]< nums2[p2])? nums1_copy[p1++]: nums2[p2++];// if there are still elements to addif(p1 < m)
System.arraycopy(nums1_copy, p1, nums1, p1 + p2, m + n - p1 - p2);if(p2 < n)
System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2);}}
classSolution(object):defmerge(self, nums1, m, nums2, n):"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: void Do not return anything, modify nums1 in-place instead.
"""# Make a copy of nums1.
nums1_copy = nums1[:m]
nums1[:]=[]# Two get pointers for nums1_copy and nums2.
p1 =0
p2 =0# Compare elements from nums1_copy and nums2# and add the smallest one into nums1.while p1 < m and p2 < n:if nums1_copy[p1]< nums2[p2]:
nums1.append(nums1_copy[p1])
p1 +=1else:
nums1.append(nums2[p2])
p2 +=1# if there are still elements to addif p1 < m:
nums1[p1 + p2:]= nums1_copy[p1:]if p2 < n:
nums1[p1 + p2:]= nums2[p2:]
funcmerge(nums1 []int, m int, nums2 []int, n int){
sort.Ints(append(nums1[:m], nums2...))}
第八十九题:
classSolution{public:
vector<int>grayCode(int n){
vector<int>res(1,0);while(n --){for(int i = res.size()-1; i >=0; i --){
res[i]*=2;
res.push_back(res[i]+1);}}return res;}};
classSolution{public List<Integer>grayCode(int n){
List<Integer> res =newArrayList<Integer>(){{add(0);}};int head =1;for(int i =0; i < n; i++){for(int j = res.size()-1; j >=0; j--)
res.add(head + res.get(j));
head <<=1;}return res;}}
classSolution:defgrayCode(self, n:int)-> List[int]:
res, head =[0],1for i inrange(n):for j inrange(len(res)-1,-1,-1):
res.append(head + res[j])
head <<=1return res
funcgrayCode(n int)[]int{
ret :=make([]int,1<<n)for i :=1; i <= n; i++{
s :=1<<(i -1)for j :=0; j <1<<(i-1); j++{
ret[s+j]= ret[s-j-1]+ s
}}return ret
}
第九十题:
classSolution{public:
vector<vector<int>> ans;
vector<int> path;
vector<vector<int>>subsetsWithDup(vector<int>& nums){sort(nums.begin(), nums.end());dfs(nums,0);return ans;}voiddfs(vector<int>& nums,int u){if(u == nums.size()){
ans.push_back(path);return;}int k = u +1;while(k < nums.size()&& nums[k]== nums[u]) k ++;for(int i =0; i <= k - u; i ++){dfs(nums, k);
path.push_back(nums[u]);}for(int i =0; i <= k - u; i ++){
path.pop_back();}}};
public List<List<Integer>>subsetsWithDup(int[] nums){
List<List<Integer>> ans =newArrayList<>();
Arrays.sort(nums);//排序getAns(nums,0,newArrayList<>(), ans);return ans;}privatevoidgetAns(int[] nums,int start, ArrayList<Integer> temp, List<List<Integer>> ans){
ans.add(newArrayList<>(temp));for(int i = start; i < nums.length; i++){//和上个数字相等就跳过if(i > start && nums[i]== nums[i -1]){continue;}
temp.add(nums[i]);getAns(nums, i +1, temp, ans);
temp.remove(temp.size()-1);}}
classSolution:defsubsetsWithDup(self, nums: List[int])-> List[List[int]]:ifnot nums:return[]
nums.sort()
res =[[]]
cur =[]for i inrange(len(nums)):if i >0and nums[i -1]== nums[i]:
cur =[tmp +[nums[i]]for tmp in cur]else:
cur =[tmp +[nums[i]]for tmp in res]
res += cur
return res
funcsubsetsWithDup(nums []int)(result [][]int){var dfs func(temp []int, idx int)
n :=len(nums)
sort.Ints(nums)
dfs =func(temp []int, idx int){
result =append(result,append([]int(nil), temp...))for i := idx; i < n; i++{if i > idx && nums[i]== nums[i-1]{continue}
temp =append(temp, nums[i])dfs(temp, i+1)
temp = temp[:len(temp)-1]}}dfs([]int{},0)return}
第九十一题:
classSolution{public:intnumDecodings(string s){int n = s.size();
s =' '+ s;
vector<int>f(n +1);
f[0]=1;for(int i =1; i <= n; i ++){if(s[i]>='1'&& s[i]<='9') f[i]+= f[i -1];if(i >1){int t =(s[i -1]-'0')*10+ s[i]-'0';if(t >=10&& t <=26) f[i]+= f[i -2];}}return f[n];}};
第八十五题:class Solution {public: int largestRectangleArea(vector<int>& h) { int n = h.size(); vector<int> left(n), right(n); stack<int> stk; for (int i = 0; i < n; i ++ ) { while (stk