本文主要介紹leetcode 的一個問題每日更換卡(leetcod: m = 3 n = 3 k = 5 輸出: 3 解釋:乘法表:123246369 .第五個最小的數(shù)是3 (1 2 2 3 3) 想法:二分搜索法 考慮每行有幾個不超過x的數(shù):min(|x/i| n) 那么不超過x的乘法表總數(shù)就是每行不超過x的數(shù)之和 為什么下面代碼中返回的左必須在乘法表中?首先 乘法表中第k個最小的數(shù)必須在[left right]中 也就是在集合{left left 1 ... x ...對} 因為[左 右]最終會收斂到某一點 又因為乘法表中第k個最小的數(shù)一定在[左 右] 所以這個點一定是x 在循環(huán)迭代的過程中 左不一定在乘法表中 但x一定在[左 右] 循環(huán)跳出的條件是left=right 所以有l(wèi)eft = right = x class solution { public int findthnumber(int m int n int k) {int left = 1 right = m * n;while(左右){ int mid = left(右-左)/2;int temp = 0;for(int i = 1;i = m;i ) { temp = math.min(mid / i n);} if(temp = k){ right = mid;} else { left = mid 1;} }向左返回;}}# 22/05/19:使數(shù)組元素相等的最小移動次數(shù)ii給出一個長度為n的整數(shù)數(shù)組nums 并返回使所有數(shù)組元素相等所需的最小移動次數(shù) 在一個步驟中 您可以在數(shù)組中的元素上加1或減1 示例1:input: nums = [1 2 3] output: 2說明:只需要兩步(操作指南每一步使一個元素加1或 減1): [1 2 3] = [2 2 3] = [2 2 2]思路:其實就是把數(shù)組排序后求中位數(shù)就行了 class solution { public int min moves 2(int[]nums){ arrays . sort(nums);int left = 0 right = nums . length-1;int mid = left(右-左)/2;int res = 0;for(;左=右;left right-){ res = nums[right]-nums[left];} return res}}標簽:乘法表陣列,下面一起看看leetcode 的一個問題每日更換卡(leetcod: m = 3 n = 3 k = 5 輸出: 3 解釋:乘法表:123246369 .第五個最小的數(shù)是3 (1 2 2 3 3) 想法:二分搜索法 考慮每行有幾個不超過x的數(shù):min(|x/i| n) 那么不超過x的乘法表總數(shù)就是每行不超過x的數(shù)之和 為什么下面代碼中返回的左必須在乘法表中?首先 乘法表中第k個最小的數(shù)必須在[left right]中 也就是在集合{left left 1 ... x ...對} 因為[左 右]最終會收斂到某一點 又因為乘法表中第k個最小的數(shù)一定在[左 右] 所以這個點一定是x 在循環(huán)迭代的過程中 左不一定在乘法表中 但x一定在[左 右] 循環(huán)跳出的條件是left=right 所以有l(wèi)eft = right = x class solution { public int findthnumber(int m int n int k) {int left = 1 right = m * n;while(左右){ int mid = left(右-左)/2;int temp = 0;for(int i = 1;i = m;i ) { temp = math.min(mid / i n);} if(temp = k){ right = mid;} else { left = mid 1;} }向左返回;}}# 22/05/19:使數(shù)組元素相等的最小移動次數(shù)ii給出一個長度為n的整數(shù)數(shù)組nums 并返回使所有數(shù)組元素相等所需的最小移動次數(shù) 在一個步驟中 您可以在數(shù)組中的元素上加1或減1 示例1:input: nums = [1 2 3] output: 2說明:只需要兩步(操作指南每一步使一個元素加1或 減1): [1 2 3] = [2 2 3] = [2 2 2]思路:其實就是把數(shù)組排序后求中位數(shù)就行了 class solution { public int min moves 2(int[]nums){ arrays . sort(nums);int left = 0 right = nums . length-1;int mid = left(右-左)/2;int res = 0;for(;左=右;left right-){ res = nums[right]-nums[left];} return res}}標簽:乘法表陣列相關(guān)資訊。
了解更多l(xiāng)eetcode 的一個問題每日更換卡(leetcod: m = 3 n = 3 k = 5 輸出: 3 解釋:乘法表:123246369 .第五個最小的數(shù)是3 (1 2 2 3 3) 想法:二分搜索法 考慮每行有幾個不超過x的數(shù):min(|x/i| n) 那么不超過x的乘法表總數(shù)就是每行不超過x的數(shù)之和 為什么下面代碼中返回的左必須在乘法表中?首先 乘法表中第k個最小的數(shù)必須在[left right]中 也就是在集合{left left 1 ... x ...對} 因為[左 右]最終會收斂到某一點 又因為乘法表中第k個最小的數(shù)一定在[左 右] 所以這個點一定是x 在循環(huán)迭代的過程中 左不一定在乘法表中 但x一定在[左 右] 循環(huán)跳出的條件是left=right 所以有l(wèi)eft = right = x class solution { public int findthnumber(int m int n int k) {int left = 1 right = m * n;while(左右){ int mid = left(右-左)/2;int temp = 0;for(int i = 1;i = m;i ) { temp = math.min(mid / i n);} if(temp = k){ right = mid;} else { left = mid 1;} }向左返回;}}# 22/05/19:使數(shù)組元素相等的最小移動次數(shù)ii給出一個長度為n的整數(shù)數(shù)組nums 并返回使所有數(shù)組元素相等所需的最小移動次數(shù) 在一個步驟中 您可以在數(shù)組中的元素上加1或減1 示例1:input: nums = [1 2 3] output: 2說明:只需要兩步(操作指南每一步使一個元素加1或 減1): [1 2 3] = [2 2 3] = [2 2 2]思路:其實就是把數(shù)組排序后求中位數(shù)就行了 class solution { public int min moves 2(int[]nums){ arrays . sort(nums);int left = 0 right = nums . length-1;int mid = left(右-左)/2;int res = 0;for(;左=右;left right-){ res = nums[right]-nums[left];} return res}}標簽:乘法表陣列相關(guān)內(nèi)容請關(guān)注本站點。