個人簡介:Java領域新星創作者;阿里云技術博主、星級博主、專家博主;正在Java學習的路上摸爬滾打,記錄學習的過程~
個人主頁:.29.的博客
學習社區:進去逛一逛~
目錄
- 基礎算法練習題
- 🚀1. 兩數之和
- 🚀13. 羅馬數字轉整數
- 🚀26. 刪除有序數組中的重復項
- 🚀2022. 將一維數組轉變成二維數組
- 🚀LCR 158. 庫存管理 II
- 🚀88. 合并兩個有序數組
- 🚀704. 二分查找
- 🚀69. x 的平方根
- 🚀118. 楊輝三角
- 🚀125. 驗證回文串
- 🚀344. 反轉字符串
- 🚀191. 位1的個數
- 🚀326. 3 的冪
- 🚀204. 計數質數
- 🚀2427. 公因子的數目
- 🚀1979. 找出數組的最大公約數
- 🚀1984. 學生分數的最小差值
基礎算法練習題
🚀1. 兩數之和
?點擊跳轉:1. 兩數之和
給定一個整數數組
nums
和一個整數目標值target
,請你在該數組中找出 和為目標值target
的那 兩個 整數,并返回它們的數組下標。你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。
你可以按任意順序返回答案。
示例 1:
輸入:nums = [2,7,11,15], target = 9 輸出:[0,1] 解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
輸入:nums = [3,2,4], target = 6 輸出:[1,2]
示例 3:
輸入:nums = [3,3], target = 6 輸出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只會存在一個有效答案
通過哈希表實現比較,操作哈希表的開銷接近O(1)
:
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>();for(int i = 0;i < nums.length; ++i){map.put(nums[i], i);}for(int i = 0;i < nums.length; ++i){int key = target - nums[i];if(map.containsKey(key) && map.get(key) != i){return new int[]{i, map.get(key)};}}return null;}
}
🚀13. 羅馬數字轉整數
?點擊跳轉:13. 羅馬數字轉整數
羅馬數字包含以下七種字符:
I
,V
,X
,L
,C
,D
和M
。字符 數值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000
例如, 羅馬數字
2
寫做II
,即為兩個并列的 1 。12
寫做XII
,即為X
+II
。27
寫做XXVII
, 即為XX
+V
+II
。通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做
IIII
,而是IV
。數字 1 在數字 5 的左邊,所表示的數等于大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為IX
。這個特殊的規則只適用于以下六種情況:
I
可以放在V
(5) 和X
(10) 的左邊,來表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左邊,來表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左邊,來表示 400 和 900。給定一個羅馬數字,將其轉換成整數。
示例 1:
輸入: s = "III" 輸出: 3
示例 2:
輸入: s = "IV" 輸出: 4
示例 3:
輸入: s = "IX" 輸出: 9
示例 4:
輸入: s = "LVIII" 輸出: 58 解釋: L = 50, V= 5, III = 3.
示例 5:
輸入: s = "MCMXCIV" 輸出: 1994 解釋: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15
s
僅含字符('I', 'V', 'X', 'L', 'C', 'D', 'M')
- 題目數據保證
s
是一個有效的羅馬數字,且表示整數在范圍[1, 3999]
內- 題目所給測試用例皆符合羅馬數字書寫規則,不會出現跨位等情況。
- IL 和 IM 這樣的例子并不符合題目要求,49 應該寫作 XLIX,999 應該寫作 CMXCIX 。
自己想的,菜
:
class Solution {public int romanToInt(String s) {Map<Character, Integer> cMap = new HashMap<>();Map<String, Integer> sMap = new HashMap<>();int ans = 0;cMap.put('I', 1);cMap.put('V', 5);cMap.put('X', 10);cMap.put('L', 50);cMap.put('C', 100);cMap.put('D', 500);cMap.put('M', 1000);sMap.put("IV", 4);sMap.put("IX", 9);sMap.put("XL", 40);sMap.put("XC", 90);sMap.put("CD", 400);sMap.put("CM", 900);char[] arr = s.toCharArray();for(int i = 0;i < arr.length; ++i){if(i + 1 != arr.length && sMap.containsKey("" + arr[i] + arr[i + 1])){ans += sMap.get("" + arr[i] + arr[i + 1]);++i;}else{ans += cMap.get(arr[i]);}}return ans;}
}
優質解答
:
class Solution {public int romanToInt(String s) {int ans = 0;int preNum = getNum(s.charAt(0));for(int i = 1;i < s.length(); ++i){int num = getNum(s.charAt(i));if(preNum < num){ans -= preNum;}else{ans += preNum;}preNum = num;}return ans + preNum;}public int getNum(char c){switch(c){case 'I': return 1;case 'V': return 5;case 'X': return 10;case 'L': return 50;case 'C': return 100;case 'D': return 500;case 'M': return 1000;default: return 0;}}
}
🚀26. 刪除有序數組中的重復項
?點擊跳轉:26. 刪除有序數組中的重復項
給你一個 非嚴格遞增排列 的數組
nums
,請你** 原地** 刪除重復出現的元素,使每個元素 只出現一次 ,返回刪除后數組的新長度。元素的 相對順序 應該保持 一致 。然后返回nums
中唯一元素的個數。考慮
nums
的唯一元素的數量為k
,你需要做以下事情確保你的題解可以被通過:
- 更改數組
nums
,使nums
的前k
個元素包含唯一元素,并按照它們最初在nums
中出現的順序排列。nums
的其余元素與nums
的大小不重要。- 返回
k
。判題標準:
系統會用下面的代碼來測試你的題解:
int[] nums = [...]; // 輸入數組 int[] expectedNums = [...]; // 長度正確的期望答案int k = removeDuplicates(nums); // 調用assert k == expectedNums.length; for (int i = 0; i < k; i++) {assert nums[i] == expectedNums[i]; }
如果所有斷言都通過,那么您的題解將被 通過。
示例 1:
輸入:nums = [1,1,2] 輸出:2, nums = [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] 解釋:函數應該返回新的長度 5 , 并且原數組 nums 的前五個元素被修改為 0, 1, 2, 3, 4 。不需要考慮數組中超出新長度后面的元素。
提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
已按 非嚴格遞增 排列
哈希表
class Solution {public int removeDuplicates(int[] nums) {Map<Integer, Integer> map = new HashMap<>();int index = 0;for(int num : nums){if(!map.containsKey(num)){map.put(num, index++);}}for(Map.Entry<Integer,Integer> entry : map.entrySet()){nums[entry.getValue()] = entry.getKey();}return map.size();}
}
雙指針
:
class Solution {public int removeDuplicates(int[] nums) {int p = 0;int q = 1;while(q < nums.length){if(nums[q] != nums[p]){if(q - p >= 1){nums[p + 1] = nums[q];++p;}}++q;}return p + 1;}
}
🚀2022. 將一維數組轉變成二維數組
?點擊跳轉:2022. 將一維數組轉變成二維數組
給你一個下標從 0 開始的一維整數數組
original
和兩個整數m
和n
。你需要使用original
中 所有 元素創建一個m
行n
列的二維數組。
original
中下標從0
到n - 1
(都 包含 )的元素構成二維數組的第一行,下標從n
到2 * n - 1
(都 包含 )的元素構成二維數組的第二行,依此類推。請你根據上述過程返回一個
m x n
的二維數組。如果無法構成這樣的二維數組,請你返回一個空的二維數組。示例 1:
輸入:original = [1,2,3,4], m = 2, n = 2 輸出:[[1,2],[3,4]] 解釋: 構造出的二維數組應該包含 2 行 2 列。 original 中第一個 n=2 的部分為 [1,2] ,構成二維數組的第一行。 original 中第二個 n=2 的部分為 [3,4] ,構成二維數組的第二行。
示例 2:
輸入:original = [1,2,3], m = 1, n = 3 輸出:[[1,2,3]] 解釋: 構造出的二維數組應該包含 1 行 3 列。 將 original 中所有三個元素放入第一行中,構成要求的二維數組。
示例 3:
輸入:original = [1,2], m = 1, n = 1 輸出:[] 解釋: original 中有 2 個元素。 無法將 2 個元素放入到一個 1x1 的二維數組中,所以返回一個空的二維數組。
示例 4:
輸入:original = [3], m = 1, n = 2 輸出:[] 解釋: original 中只有 1 個元素。 無法將 1 個元素放滿一個 1x2 的二維數組,所以返回一個空的二維數組。
提示:
1 <= original.length <= 5 * 104
1 <= original[i] <= 105
1 <= m, n <= 4 * 104
解答
:
class Solution {public int[][] construct2DArray(int[] original, int m, int n) {int[][] ans = new int[][]{};int length = original.length;if(length != m * n) return ans;int index = 0;ans = new int[m][n];for(int i = 0;i < m; ++i){for(int j = 0;j < n; ++j){ans[i][j] = original[index++];}}return ans;}
}
🚀LCR 158. 庫存管理 II
?點擊跳轉:LCR 158. 庫存管理 II
倉庫管理員以數組
stock
形式記錄商品庫存表。stock[i]
表示商品id
,可能存在重復。請返回庫存表中數量大于stock.length / 2
的商品id
。示例 1:
輸入: stock = [6, 1, 3, 1, 1, 1] 輸出: 1
限制:
1 <= stock.length <= 50000
- 給定數組為非空數組,且存在結果數字
哈希表
:
class Solution {public int inventoryManagement(int[] stock) {Map<Integer, Integer> map = new HashMap<>();int ans = -1;for(int num : stock){if(!map.containsKey(num)){map.put(num, 1);}else{map.put(num, map.get(num) + 1);}}for(Map.Entry<Integer, Integer> entry : map.entrySet()){int key = entry.getKey();int value = entry.getValue();if(value > stock.length / 2){ans = key;}}return ans;}
}
排序求眾數
:
class Solution {public int inventoryManagement(int[] stock) {Arrays.sort(stock);return stock[stock.length / 2];}
}
🚀88. 合并兩個有序數組
?點擊跳轉:88. 合并兩個有序數組
給你兩個按 非遞減順序 排列的整數數組
nums1
和nums2
,另有兩個整數m
和n
,分別表示nums1
和nums2
中的元素數目。請你 合并
nums2
到nums1
中,使合并后的數組同樣按 非遞減順序 排列。**注意:**最終,合并后數組不應由函數返回,而是存儲在數組
nums1
中。為了應對這種情況,nums1
的初始長度為m + n
,其中前m
個元素表示應合并的元素,后n
個元素為0
,應忽略。nums2
的長度為n
。示例 1:
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 輸出:[1,2,2,3,5,6] 解釋:需要合并 [1,2,3] 和 [2,5,6] 。 合并結果是 [1,2,2,3,5,6] ,其中斜體加粗標注的為 nums1 中的元素。
示例 2:
輸入:nums1 = [1], m = 1, nums2 = [], n = 0 輸出:[1] 解釋:需要合并 [1] 和 [] 。 合并結果是 [1] 。
示例 3:
輸入:nums1 = [0], m = 0, nums2 = [1], n = 1 輸出:[1] 解釋:需要合并的數組是 [] 和 [1] 。 合并結果是 [1] 。 注意,因為 m = 0 ,所以 nums1 中沒有元素。nums1 中僅存的 0 僅僅是為了確保合并結果可以順利存放到 nums1 中。
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[j] <= 109
解答
:
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int help[] = new int[m + n];int p1 = 0;int p2 = 0;int i = 0;while(p1 < m && p2 < n){help[i++] = nums1[p1] <= nums2[p2] ? nums1[p1++] : nums2[p2++];}while(p1 < m) help[i++] = nums1[p1++];while(p2 < n) help[i++] = nums2[p2++];for(i = 0;i < help.length; ++i){nums1[i] = help[i];}}
}
🚀704. 二分查找
?點擊跳轉:704. 二分查找
給定一個
n
個元素有序的(升序)整型數組nums
和一個目標值target
,寫一個函數搜索nums
中的target
,如果目標值存在返回下標,否則返回-1
。示例 1:
輸入: nums = [-1,0,3,5,9,12], target = 9 輸出: 4 解釋: 9 出現在 nums 中并且下標為 4
示例 2:
輸入: nums = [-1,0,3,5,9,12], target = 2 輸出: -1 解釋: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假設
nums
中的所有元素是不重復的。n
將在[1, 10000]
之間。nums
的每個元素都將在[-9999, 9999]
之間。
二分查找
:
class Solution {public int search(int[] nums, int target) {int L = 0;int R = nums.length - 1;int ans = -1;while(L <= R){int mid = (L+R)/2;if(nums[mid] == target){ans = mid;break;}else if(nums[mid] < target){L = mid + 1;}else if(nums[mid] > target){R = mid - 1;}}return ans;}
}
🚀69. x 的平方根
?點擊跳轉:69. x 的平方根
給你一個非負整數
x
,計算并返回x
的 算術平方根 。由于返回類型是整數,結果只保留 整數部分 ,小數部分將被 舍去 。
**注意:**不允許使用任何內置指數函數和算符,例如
pow(x, 0.5)
或者x ** 0.5
。示例 1:
輸入:x = 4 輸出:2
示例 2:
輸入:x = 8 輸出:2 解釋:8 的算術平方根是 2.82842..., 由于返回類型是整數,小數部分將被舍去。
提示:
0 <= x <= 231 - 1
暴力
:
class Solution {public int mySqrt(int x) {for(long i=0;;i++){if(i*i>x){return (int)i-1;}}}
}
二分
:
class Solution {public int mySqrt(int x) {int l = 0;int r = x;int ans = 0;while(l <= r){int mid = l + ((r - l) >> 1);if((long) mid * mid <= x){ans = mid;l = mid + 1;}else{r = mid - 1;}}return ans;}
}
🚀118. 楊輝三角
?點擊跳轉:118. 楊輝三角
給定一個非負整數 *
numRows
,*生成「楊輝三角」的前numRows
行。在「楊輝三角」中,每個數是它左上方和右上方的數的和。
示例 1:
輸入: numRows = 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
輸入: numRows = 1 輸出: [[1]]
提示:
1 <= numRows <= 30
題解
:
class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> ans = new ArrayList<>();for(int i = 0;i < numRows; ++i){List<Integer> list = new ArrayList<>();for(int j = 0;j <= i; ++j){if(j == 0 || j == i){list.add(1);}else{list.add(ans.get(i - 1).get(j) + ans.get(i - 1).get(j - 1));}}ans.add(list);}return ans;}
}
🚀125. 驗證回文串
?點擊跳轉:125. 驗證回文串
如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數字字符之后,短語正著讀和反著讀都一樣。則可以認為該短語是一個 回文串 。
字母和數字都屬于字母數字字符。
給你一個字符串
s
,如果它是 回文串 ,返回true
;否則,返回false
。示例 1:
輸入: s = "A man, a plan, a canal: Panama" 輸出:true 解釋:"amanaplanacanalpanama" 是回文串。
示例 2:
輸入:s = "race a car" 輸出:false 解釋:"raceacar" 不是回文串。
示例 3:
輸入:s = " " 輸出:true 解釋:在移除非字母數字字符之后,s 是一個空字符串 "" 。 由于空字符串正著反著讀都一樣,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s
僅由可打印的 ASCII 字符組成
使用StringBuilder API
:
class Solution {public boolean isPalindrome(String s) {StringBuilder sb = new StringBuilder();for(int i = 0;i < s.length(); ++i){char c = s.charAt(i);if(Character.isLetterOrDigit(c)){sb.append(Character.toLowerCase(c));}}StringBuilder sb_r = new StringBuilder(sb).reverse();return sb.toString().equals(sb_r.toString());}
}
🚀344. 反轉字符串
?點擊跳轉:344. 反轉字符串
編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組
s
的形式給出。不要給另外的數組分配額外的空間,你必須**原地修改輸入數組**、使用 O(1) 的額外空間解決這一問題。
示例 1:
輸入:s = ["h","e","l","l","o"] 輸出:["o","l","l","e","h"]
示例 2:
輸入:s = ["H","a","n","n","a","h"] 輸出:["h","a","n","n","a","H"]
提示:
1 <= s.length <= 105
s[i]
都是 ASCII 碼表中的可打印字符
雙指針
:
class Solution {public void reverseString(char[] s) {if(s.length < 2) return;for(int i = 0;i < s.length / 2; ++i){swap(s, i, s.length - 1 - i);}}public void swap(char[] arr, int a, int b){char temp = arr[a];arr[a] = arr[b];arr[b] = temp;}
}
🚀191. 位1的個數
?點擊跳轉:191. 位1的個數
編寫一個函數,輸入是一個無符號整數(以二進制串的形式),返回其二進制表達式中數字位數為 ‘1’ 的個數(也被稱為漢明重量)。
提示:
- 請注意,在某些語言(如 Java)中,沒有無符號整數類型。在這種情況下,輸入和輸出都將被指定為有符號整數類型,并且不應影響您的實現,因為無論整數是有符號的還是無符號的,其內部的二進制表示形式都是相同的。
- 在 Java 中,編譯器使用二進制補碼記法來表示有符號整數。因此,在 示例 3 中,輸入表示有符號整數
-3
。示例 1:
輸入:n = 00000000000000000000000000001011 輸出:3 解釋:輸入的二進制串 00000000000000000000000000001011 中,共有三位為 '1'。
示例 2:
輸入:n = 00000000000000000000000010000000 輸出:1 解釋:輸入的二進制串 00000000000000000000000010000000 中,共有一位為 '1'。
示例 3:
輸入:n = 11111111111111111111111111111101 輸出:31 解釋:輸入的二進制串 11111111111111111111111111111101 中,共有 31 位為 '1'。
提示:
- 輸入必須是長度為
32
的 二進制串 。
位運算
:
public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int ans = 0;for(int i = 0;i < 32; ++i){if((n & 1) == 1) ans++;n >>>= 1;}return ans;}
}
🚀326. 3 的冪
?點擊跳轉:326. 3 的冪
給定一個整數,寫一個函數來判斷它是否是 3 的冪次方。如果是,返回
true
;否則,返回false
。整數
n
是 3 的冪次方需滿足:存在整數x
使得n == 3x
示例 1:
輸入:n = 27 輸出:true
示例 2:
輸入:n = 0 輸出:false
示例 3:
輸入:n = 9 輸出:true
示例 4:
輸入:n = 45 輸出:false
提示:
-231 <= n <= 231 - 1
解答
:
class Solution {public boolean isPowerOfThree(int n) {if(n == 1) return true;if(n == 0) return false;while(true){if(n % 3 == 0){n /= 3;if(n == 1) return true;}else{return false;}}}
}
🚀204. 計數質數
?點擊跳轉:204. 計數質數
給定整數
n
,返回 所有小于非負整數n
的質數的數量 。示例 1:
輸入:n = 10 輸出:4 解釋:小于 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。
示例 2:
輸入:n = 0 輸出:0
示例 3:
輸入:n = 1 輸出:0
提示:
0 <= n <= 5 * 106
埃氏篩
:
class Solution {public int countPrimes(int n) {boolean[] flag = new boolean[n];Arrays.fill(flag, true);for(int i = 2;i*i < n; ++i){if(flag[i]){for(int j = i * i;j < n; j += i){flag[j] = false;}}}int ans = 0;for(int i = 2;i < n; ++i){if(flag[i]) ++ans;}return ans;}
}
🚀2427. 公因子的數目
?點擊跳轉:2427. 公因子的數目
給你兩個正整數
a
和b
,返回a
和b
的 公 因子的數目。如果
x
可以同時整除a
和b
,則認為x
是a
和b
的一個 公因子 。示例 1:
輸入:a = 12, b = 6 輸出:4 解釋:12 和 6 的公因子是 1、2、3、6 。
示例 2:
輸入:a = 25, b = 30 輸出:2 解釋:25 和 30 的公因子是 1、5 。
提示:
1 <= a, b <= 1000
暴力
:
class Solution {public int commonFactors(int a, int b) {int min = a > b ? b: a;int ans = 0;for(int i = 1;i <= min; ++i){if(a % i == 0 && b % i == 0) ans++;}return ans;}
}
🚀1979. 找出數組的最大公約數
?點擊跳轉:1979. 找出數組的最大公約數
給你一個整數數組
nums
,返回數組中最大數和最小數的 最大公約數 。兩個數的 最大公約數 是能夠被兩個數整除的最大正整數。
示例 1:
輸入:nums = [2,5,6,9,10] 輸出:2 解釋: nums 中最小的數是 2 nums 中最大的數是 10 2 和 10 的最大公約數是 2
示例 2:
輸入:nums = [7,5,6,8,3] 輸出:1 解釋: nums 中最小的數是 3 nums 中最大的數是 8 3 和 8 的最大公約數是 1
示例 3:
輸入:nums = [3,3] 輸出:3 解釋: nums 中最小的數是 3 nums 中最大的數是 3 3 和 3 的最大公約數是 3
提示:
2 <= nums.length <= 1000
1 <= nums[i] <= 1000
一次遍歷 + 輾轉相除
class Solution {public int findGCD(int[] nums) {int min = Integer.MAX_VALUE;int max = Integer.MIN_VALUE;for(int i = 0;i < nums.length; ++i){if(nums[i] < min) min = nums[i];if(nums[i] > max) max = nums[i];}return GCD(max, min);}//輾轉相除法public int GCD(int a, int b){return b == 0 ? a : GCD(b, a%b);}
}
🚀1984. 學生分數的最小差值
?點擊跳轉:1984. 學生分數的最小差值
給你一個 下標從 0 開始 的整數數組
nums
,其中nums[i]
表示第i
名學生的分數。另給你一個整數k
。從數組中選出任意
k
名學生的分數,使這k
個分數間 最高分 和 最低分 的 差值 達到 最小化 。返回可能的 最小差值 。
示例 1:
輸入:nums = [90], k = 1 輸出:0 解釋:選出 1 名學生的分數,僅有 1 種方法: - [90] 最高分和最低分之間的差值是 90 - 90 = 0 可能的最小差值是 0
示例 2:
輸入:nums = [9,4,1,7], k = 2 輸出:2 解釋:選出 2 名學生的分數,有 6 種方法: - [9,4,1,7] 最高分和最低分之間的差值是 9 - 4 = 5 - [9,4,1,7] 最高分和最低分之間的差值是 9 - 1 = 8 - [9,4,1,7] 最高分和最低分之間的差值是 9 - 7 = 2 - [9,4,1,7] 最高分和最低分之間的差值是 4 - 1 = 3 - [9,4,1,7] 最高分和最低分之間的差值是 7 - 4 = 3 - [9,4,1,7] 最高分和最低分之間的差值是 7 - 1 = 6 可能的最小差值是 2
提示:
1 <= k <= nums.length <= 1000
0 <= nums[i] <= 105
題解
:
class Solution {public int minimumDifference(int[] nums, int k) {Arrays.sort(nums);if(k == 1) return 0;int n = nums.length;int min=Integer.MAX_VALUE;for(int i=0;i<=n-k;i++){if((nums[i+k-1]-nums[i])<min){min=nums[i+k-1]-nums[i];}}return min;}
}