【LeetCode】3月21日打卡-Day6
題1 水壺問題
描述
有兩個容量分別為 x升 和 y升 的水壺以及無限多的水。請判斷能否通過使用這兩個水壺,從而可以得到恰好 z升 的水?
如果可以,最后請用以上水壺中的一或兩個來盛放取得的 z升 水。
你允許:
裝滿任意一個水壺
清空任意一個水壺
從一個水壺向另外一個水壺倒水,直到裝滿或者倒空
示例 1: (From the famous “Die Hard” example)
輸入: x = 3, y = 5, z = 4
輸出: True
示例 2:
輸入: x = 2, y = 6, z = 5
輸出: False
題解
思路:首先判斷極端情況,如果x和y的容量和小于z,永遠不可能裝滿。如果z的容量等于x或y或x+y,倒一次水就可以裝滿。
在任意一個時刻,我們可以且僅可以采取以下幾種操作:
假設x > y
1.把 X 壺的水灌進 Y 壺,直至灌滿或倒空; X壺:cur_x-y Y壺:+y
2.把 Y 壺的水灌進 X 壺,直至灌滿或倒空; X壺:cur_x+y Y壺:-y
3.把 X 壺灌滿; +x
4.把 Y 壺灌滿; +y
5.把 X 壺倒空; -x
6.把 Y 壺倒空。 -y
每次操作只會讓桶里的水總量增加 x,增加 y,減少 x,或者減少 y。
找到一對整數 a,b 使得 ax+by=z
而只要滿足 z ≤ x+y,且這樣的 a, b存在,那么我們的目標就是可以達成的。
貝祖定理:ax+by=z有解當且僅當 z 是 x, y的最大公約數的倍數。因此我們只需要找到 x, y的最大公約數并判斷 z 是否是它的倍數即可
gcd:找x和y的最大公約數
class Solution {public boolean canMeasureWater(int x, int y, int z) {if(x + y < z) return false;if(z == 0 || z == x + y || z == x || z == y) return true;int gcd = gcd(x, y);return z % gcd == 0;}public int gcd(int a, int b){if(b == 0){return a;}return gcd(b, a % b);} }題2 刪除排序數組重復項
描述
給定一個排序數組,你需要在 原地 刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。
不要使用額外的數組空間,你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。
示例 1:
給定數組 nums = [1,1,2],
函數應該返回新的長度 2, 并且原數組 nums 的前兩個元素被修改為 1, 2。
你不需要考慮數組中超出新長度后面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函數應該返回新的長度 5, 并且原數組 nums 的前五個元素被修改為 0, 1, 2, 3, 4。
你不需要考慮數組中超出新長度后面的元素。
說明:
為什么返回數值是整數,但輸出的答案是數組呢?
請注意,輸入數組是以「引用」方式傳遞的,這意味著在函數里修改輸入數組對于調用者是可見的。
你可以想象內部操作如下:
// nums 是以“引用”方式傳遞的。也就是說,不對實參做任何拷貝
int len = removeDuplicates(nums);
// 在函數里修改輸入數組對于調用者是可見的。
// 根據你的函數返回的長度, 它會打印出數組中該長度范圍內的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
題解1 兩個指針
思路:i指針來記錄最后返回的數組,j指針遇到相同的則向后移動,如果遇到不同的則向前覆蓋。
// 使用雙指針if(nums==null || nums.length == 1){return nums.length;}int i = 0,j =1;while(j<nums.length){if(nums[i]==nums[j]){j++;}else{i++;nums[i]=nums[j];j++;}}return i+1;官方題解
思路相同
數組完成排序后,我們可以放置兩個指針 i 和 j,其中 i 是慢指針,而 j 是快指針。只要 nums[i] = nums[j],我們就增加 j 以跳過重復項。
當我們遇到 nums[j] ≠ nums[i] 時,跳過重復項的運行已經結束,因此我們必須把它(nums[j])的值復制到 nums[i + 1]。然后遞增 i,接著我們將再次重復相同的過程,直到 j 到達數組的末尾為止。
總結
以上是生活随笔為你收集整理的【LeetCode】3月21日打卡-Day6的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (Android开发辅助工具)动态广播注
- 下一篇: HTTPS请求实现框架