目錄標題
- 導讀
- 21天動態規劃入門
- 面試題
- 資料領取
導讀

肥友們為了更好的去幫助新同學適應演算法和面試題,最近我們開始進行專項突擊一步一步來,我們先來搞一下讓大家最頭疼的一類演算法題,動態規劃我們將進行為時21天的養成計劃,還在等什么快來一起肥學進行動態規劃21天挑戰吧!!
21天動態規劃入門
你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警,
給定一個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額,
示例 1:
輸入:[1,2,3,1]
輸出:4
解釋:偷竊 1 號房屋 (金額 = 1) ,然后偷竊 3 號房屋 (金額 = 3),
偷竊到的最高金額 = 1 + 3 = 4 ,
示例 2:
輸入:[2,7,9,3,1]
輸出:12
解釋:偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1),
偷竊到的最高金額 = 2 + 9 + 1 = 12 ,
這個是我初寫的版本,有點凌亂
public int rob(int[] nums) {
if(nums.length<2)return nums[0];
int max=0;
if(nums.length<3)return Math.max(nums[0],nums[1]);
int[] nums2=new int[nums.length+1];
nums2[0]=nums[0];
nums2[1]=nums[1];
nums2[2]=nums[2]+nums2[0];
max=Math.max(nums2[1],nums2[2]);
for(int i=3;i<nums.length;i++){
nums2[i]= Math.max(nums2[i-2]+nums[i],nums2[i-3]+nums[i]);
max=Math.max(max,nums2[i]);
}
return max;
}
改進后,空間復雜度得到了優化
public int rob(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int length = nums.length;
if (length == 1) {
return nums[0];
}
int first = nums[0], second = Math.max(nums[0], nums[1]);
for (int i = 2; i < length; i++) {
int temp = second;
second = Math.max(first + nums[i], second);
first = temp;
}
return second;
}
你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金,這個地方所有的房屋都 圍成一圈
,這意味著第一個房屋和最后一個房屋是緊挨著的,同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警
,給定一個代表每個房屋存放金額的非負整數陣列,計算你 在不觸動警報裝置的情況下 ,今晚能夠偷竊到的最高金額,
示例 1:
輸入:nums = [2,3,2]
輸出:3
解釋:你不能先偷竊 1 號房屋(金額 = 2),然后偷竊 3 號房屋(金額 = 2), 因為他們是相鄰的,
示例 2:
輸入:nums = [1,2,3,1]
輸出:4
解釋:你可以先偷竊 1 號房屋(金額 = 1),然后偷竊 3 號房屋(金額 = 3),
偷竊到的最高金額 = 1 + 3 = 4 ,
示例 3:
輸入:nums = [0]
輸出:0
根據上一題很容易解出來
public int tribonacci(int n) {
if(n==3){
return 2;
}
if(n==2||n==1)return 1;
if(n==0)return 0;
int T0=0,T1=1,T2=1,T=2;
for(int i=4;i<n+1;i++){
T0=T1;
T1=T2;
T2=T;
T=T0+T1+T2;
}
return T;
}
給你一個整數陣列 nums ,你可以對它進行一些操作,
每次操作中,選擇任意一個 nums[i] ,洗掉它并獲得 nums[i] 的點數,之后,你必須洗掉 所有 等于 nums[i] - 1 和
nums[i] + 1 的元素,開始你擁有 0 個點數,回傳你能通過這些操作獲得的最大點數,
示例 1:
輸入:nums = [3,4,2]
輸出:6
解釋:
洗掉 4 獲得 4 個點數,因此 3 也被洗掉,
之后,洗掉 2 獲得 2 個點數,總共獲得 6 個點數,
示例 2:
輸入:nums = [2,2,3,3,3,4]
輸出:9
解釋:
洗掉 3 獲得 3 個點數,接著要洗掉兩個 2 和 4 ,
之后,再次洗掉 3 獲得 3 個點數,再次洗掉 3 獲得 3 個點數,
總共獲得 9 個點數,
public int deleteAndEarn(int[] nums) {
int max=0;
for(int i:nums){
max=Math.max(i,max);
}
int[] deleNums=new int[max];
for(int i:nums){
deleNums[i]=+i;
}
int first=deleNums[0],second=Math.max(deleNums[1],first),temp;
for(int i=2;i<max;i++){
temp=second;
second=Math.max(first+deleNums[i],second);
first=temp;
}
}
面試題
同樣也是很重要的面試問題Linux的常用命令之cp
6. rm 命令
(用于洗掉檔案或目錄,remove之意)
-f :就是force的意思,忽略不存在的檔案,不會出現警告訊息
-i :互動模式,在洗掉前會詢問用戶是否操作
-r :遞回洗掉,最常用于目錄洗掉,它是一個非常危險的引數
這套Linux面試必學知識肥學會一直更下去,我覺得我一下子都總結出來,大家肯定放在收藏夾吃灰所以我們就每天學習一點,肥學每一天,
特別介紹
📣小白練手專欄,適合剛入手的新人歡迎訂閱編程小白進階
📣python有趣練手專案里面包括了像《機器人尬聊》《惡搞程式》這樣的有趣文章,可以讓你快樂學python練手專案專欄
📣另外想學JavaWeb進廠的同學可以看看這個專欄:傳送們
📣這是個面試和考研的演算法練習我們一起加油上岸之路
資料領取
這里有python,Java學習資料還有有有趣好玩的編程專案,更有難尋的各種資源,反正看看也不虧,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/342272.html
標籤:其他
