classSolution{publicint[][]insert(int[][] intervals,int[] newInterval){int left = newInterval[0];int right = newInterval[1];boolean placed =false;
List<int[]> ansList =newArrayList<int[]>();for(int[] interval : intervals){if(interval[0]> right){// 在插入区间的右侧且无交集if(!placed){
ansList.add(newint[]{left, right});
placed =true;}
ansList.add(interval);}elseif(interval[1]< left){// 在插入区间的左侧且无交集
ansList.add(interval);}else{// 与插入区间有交集,计算它们的并集
left = Math.min(left, interval[0]);
right = Math.max(right, interval[1]);}}if(!placed){
ansList.add(newint[]{left, right});}int[][] ans =newint[ansList.size()][2];for(int i =0; i < ansList.size();++i){
ans[i]= ansList.get(i);}return ans;}}
classSolution:definsert(self, intervals: List[List[int]], newInterval: List[int])-> List[List[int]]:
left, right = newInterval
placed =False
ans =list()for li, ri in intervals:if li > right:# 在插入区间的右侧且无交集ifnot placed:
ans.append([left, right])
placed =True
ans.append([li, ri])elif ri < left:# 在插入区间的左侧且无交集
ans.append([li, ri])else:# 与插入区间有交集,计算它们的并集
left =min(left, li)
right =max(right, ri)ifnot placed:
ans.append([left, right])return ans
funcinsert(intervals [][]int, newInterval []int)(ans [][]int){
left, right := newInterval[0], newInterval[1]
merged :=falsefor_, interval :=range intervals {if interval[0]> right {// 在插入区间的右侧且无交集if!merged {
ans =append(ans,[]int{left, right})
merged =true}
ans =append(ans, interval)}elseif interval[1]< left {// 在插入区间的左侧且无交集
ans =append(ans, interval)}else{// 与插入区间有交集,计算它们的并集
left =min(left, interval[0])
right =max(right, interval[1])}}if!merged {
ans =append(ans,[]int{left, right})}return}funcmin(a, b int)int{if a < b {return a
}return b
}funcmax(a, b int)int{if a > b {return a
}return b
}
第五十八题:
classSolution{public:intlengthOfLastWord(string s){for(int i = s.size()-1; i >=0; i --){if(s[i]==' ')continue;int j = i -1;while(j >=0&& s[j]!=' ') j --;return i - j;}return0;}};
classSolution{publicintlengthOfLastWord(String s){int end = s.length()-1;while(end >=0&& s.charAt(end)==' ') end--;if(end <0)return0;int start = end;while(start >=0&& s.charAt(start)!=' ') start--;return end - start;}}
classSolution:deflengthOfLastWord(self, s:str)->int:ifset(s)==set(' ')orset():return0
a = s.split()returnlen(a[-1])
funclengthOfLastWord(s string)int{
i :=len(s)-1//从右往左,若一直是空格则一直往左走for i >=0&& s[i]==' '{
i--}//先从第一个没有空格的单词的最后一个字母起
j := i
for j >=0&& s[j]!=' '{
j--}//i-j则为最后一个单词的长度return i - j
}
第五十九题:
classSolution{public:
vector<vector<int>>generateMatrix(int n){
vector<vector<int>>res(n, vector<int>(n));int dx[]={0,1,0,-1}, dy[]={1,0,-1,0};for(int i =1, x =0, y =0, d =0; i <= n * n; i ++){
res[x][y]= i;int a = x + dx[d], b = y + dy[d];if(a <0|| a >= n || b <0|| b >= n || res[a][b]){
d =(d +1)%4;
a = x + dx[d], b = y + dy[d];}
x = a, y = b;}return res;}};
classSolution{publicint[][]generateMatrix(int n){int l =0, r = n -1, t =0, b = n -1;int[][] mat =newint[n][n];int num =1, tar = n * n;while(num <= tar){for(int i = l; i <= r; i++) mat[t][i]= num++;// left to right.
t++;for(int i = t; i <= b; i++) mat[i][r]= num++;// top to bottom.
r--;for(int i = r; i >= l; i--) mat[b][i]= num++;// right to left.
b--;for(int i = b; i >= t; i--) mat[i][l]= num++;// bottom to top.
l++;}return mat;}}
classSolution:defgenerateMatrix(self, n:int)->[[int]]:
l, r, t, b =0, n -1,0, n -1
mat =[[0for _ inrange(n)]for _ inrange(n)]
num, tar =1, n * n
while num <= tar:for i inrange(l, r +1):# left to right
mat[t][i]= num
num +=1
t +=1for i inrange(t, b +1):# top to bottom
mat[i][r]= num
num +=1
r -=1for i inrange(r, l -1,-1):# right to left
mat[b][i]= num
num +=1
b -=1for i inrange(b, t -1,-1):# bottom to top
mat[i][l]= num
num +=1
l +=1return mat
classSolution{public:
string getPermutation(int n,int k){
string res;
vector<bool>st(10);for(int i =0; i < n; i ++){int fact =1;for(int j =1; j <= n - i -1; j ++) fact *= j;for(int j =1; j <= n; j ++){if(!st[j]){if(fact < k) k -= fact;else{
res +=to_string(j);
st[j]=true;break;}}}}return res;}};
classSolution{public String getPermutation(int n,int k){int[] factorial =newint[n];
factorial[0]=1;for(int i =1; i < n;++i){
factorial[i]= factorial[i -1]* i;}--k;
StringBuffer ans =newStringBuffer();int[] valid =newint[n +1];
Arrays.fill(valid,1);for(int i =1; i <= n;++i){int order = k / factorial[n - i]+1;for(int j =1; j <= n;++j){
order -= valid[j];if(order ==0){
ans.append(j);
valid[j]=0;break;}}
k %= factorial[n - i];}return ans.toString();}}
classSolution:defgetPermutation(self, n:int, k:int)->str:
factorial =[1]for i inrange(1, n):
factorial.append(factorial[-1]* i)
k -=1
ans =list()
valid =[1]*(n +1)for i inrange(1, n +1):
order = k // factorial[n - i]+1for j inrange(1, n +1):
order -= valid[j]if order ==0:
ans.append(str(j))
valid[j]=0break
k %= factorial[n - i]return"".join(ans)
funcgetPermutation(n int, k int)string{
factorial :=make([]int, n)
factorial[0]=1for i :=1; i < n; i++{
factorial[i]= factorial[i -1]* i
}
k--
ans :=""
valid :=make([]int, n +1)for i :=0; i <len(valid); i++{
valid[i]=1}for i :=1; i <= n; i++{
order := k / factorial[n - i]+1for j :=1; j <= n; j++{
order -= valid[j]if order ==0{
ans += strconv.Itoa(j)
valid[j]=0break}}
k %= factorial[n - i]}return ans
}
第六十一题:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/classSolution{public:
ListNode*rotateRight(ListNode* head,int k){if(!head)return head;int n =0;
ListNode* tail;for(auto p = head; p; p = p->next){
tail = p;
n ++;}
k %= n;if(!k)return head;auto p = head;for(int i =0; i < n - k -1; i ++) p = p->next;
tail->next = head;
head = p->next;
p->next =nullptr;return head;}};
classSolution{public ListNode rotateRight(ListNode head,int k){// base casesif(head == null)return null;if(head.next == null)return head;// close the linked list into the ring
ListNode old_tail = head;int n;for(n =1; old_tail.next != null; n++)
old_tail = old_tail.next;
old_tail.next = head;// find new tail : (n - k % n - 1)th node// and new head : (n - k % n)th node
ListNode new_tail = head;for(int i =0; i < n - k % n -1; i++)
new_tail = new_tail.next;
ListNode new_head = new_tail.next;// break the ring
new_tail.next = null;return new_head;}}
classSolution:defrotateRight(self, head:'ListNode', k:'int')->'ListNode':# base casesifnot head:returnNoneifnot head.next:return head
# close the linked list into the ring
old_tail = head
n =1while old_tail.next:
old_tail = old_tail.next
n +=1
old_tail.next= head
# find new tail : (n - k % n - 1)th node# and new head : (n - k % n)th node
new_tail = head
for i inrange(n - k % n -1):
new_tail = new_tail.next
new_head = new_tail.next# break the ring
new_tail.next=Nonereturn new_head
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/funcrotateRight(head *ListNode, k int)*ListNode {if head ==nil{//链表为空的情况returnnil}//快慢指针
fast, slow := head, head
i :=0
lenth :=1//统计链表长度//第一次循环,1、可能得到最终结果的slow指针或链表长度for fast.Next !=nil{if i >= k {//慢指针后移
slow = slow.Next
}
fast = fast.Next//快指针后移
lenth++
i++}if i < k {//当k大于链表长度时,取余数再进行上述的循环操作
k = k % lenth
i =0
fast = head
for fast.Next !=nil{if i >= k {
slow = slow.Next
}
fast = fast.Next
i++}}//重新规划链表
temp := head
fast.Next = temp
head = slow.Next
slow.Next =nilreturn head
}
第六十二题:
classSolution{public:intuniquePaths(int m,int n){
vector<vector<int>>f(n, vector<int>(m));for(int i =0; i < n; i ++)for(int j =0; j < m; j ++)if(!i &&!j) f[i][j]=1;else{if(i) f[i][j]+= f[i -1][j];if(j) f[i][j]+= f[i][j -1];}return f[n -1][m -1];}};
classSolution{publicintuniquePaths(int m,int n){int[][] f =newint[m][n];for(int i =0; i < m;++i){
f[i][0]=1;}for(int j =0; j < n;++j){
f[0][j]=1;}for(int i =1; i < m;++i){for(int j =1; j < n;++j){
f[i][j]= f[i -1][j]+ f[i][j -1];}}return f[m -1][n -1];}}
funcuniquePaths(m, n int)int{
dp :=make([][]int, m)for i :=range dp {
dp[i]=make([]int, n)
dp[i][0]=1}for j :=0; j < n; j++{
dp[0][j]=1}for i :=1; i < m; i++{for j :=1; j < n; j++{
dp[i][j]= dp[i-1][j]+ dp[i][j-1]}}return dp[m-1][n-1]}
第六十三题:
classSolution{public:intuniquePathsWithObstacles(vector<vector<int>>& o){int n = o.size();if(!n)return0;int m = o[0].size();
vector<vector<int>>f(n, vector<int>(m));for(int i =0; i < n; i ++)for(int j =0; j < m; j ++)if(!o[i][j]){if(!i &&!j) f[i][j]=1;else{if(i) f[i][j]+= f[i -1][j];if(j) f[i][j]+= f[i][j -1];}}return f[n -1][m -1];}};
classSolution{publicintuniquePathsWithObstacles(int[][] obstacleGrid){int n = obstacleGrid.length, m = obstacleGrid[0].length;int[] f =newint[m];
f[0]= obstacleGrid[0][0]==0?1:0;for(int i =0; i < n;++i){for(int j =0; j < m;++j){if(obstacleGrid[i][j]==1){
f[j]=0;continue;}if(j -1>=0&& obstacleGrid[i][j -1]==0){
f[j]+= f[j -1];}}}return f[m -1];}}
funcuniquePathsWithObstacles(obstacleGrid [][]int)int{
n, m :=len(obstacleGrid),len(obstacleGrid[0])
f :=make([]int, m)if obstacleGrid[0][0]==0{
f[0]=1}for i :=0; i < n; i++{for j :=0; j < m; j++{if obstacleGrid[i][j]==1{
f[j]=0continue}if j -1>=0&& obstacleGrid[i][j-1]==0{
f[j]+= f[j-1]}}}return f[len(f)-1]}
classSolution(object):defuniquePathsWithObstacles(self, obstacleGrid):"""
:type obstacleGrid: List[List[int]]
:rtype: int
"""# 定义状态:即数据元素的含义:dp表示当前位置的路径条数# 建立状态转移方程:dp[i] = dp[i]+dp[i-1]# 设定初始值:增加初始值1,即dp = [1] + [0]*n# 状态压缩:即优化数组空间,将二维数组压缩到一维数组,逐行计算当前最新路径条数,并覆盖上一行对应的路径条数# 选取dp[-2]表示到达finish位置路径总条数,因为一开始新增加的1,因此最终值要往前推一个
m =len(obstacleGrid)
n =len(obstacleGrid[0])
dp =[1]+[0]*n
for i inrange(0,m):for j inrange(0,n):
dp[j]=0if obstacleGrid[i][j]else dp[j]+dp[j-1]return dp[-2]