Java C++ 算法題解leetcode1608特殊數(shù)組特征值
更新時間:2022年09月14日 09:07:25 作者:AnjaVon
這篇文章主要為大家介紹了Java C++ 算法題解拓展leetcode1608特殊數(shù)組特征值實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
題目要求
思路一:枚舉 + 二分
- 逐一枚舉值域內(nèi)的所有值,然后二分判斷是否合法。
Java
class Solution { public int specialArray(int[] nums) { Arrays.sort(nums); int n = nums.length; for (int x = 0; x <= nums[n - 1]; x++) { // 枚舉 int l = 0, r = n -1 ; while (l < r) { // 二分 int m = l + r >> 1; if (nums[m] >= x) r = m; else l = m + 1; } if (nums[r] >= x && x == n - r) return x; } return -1; } }
- 時間復雜度:O(n log? n),排序復雜度為O(n log? n),枚舉次數(shù)為值域范圍C=1000,所以找答案的復雜度為O(C log n)
- 空間復雜度:O(log? n))
C++
class Solution { public: int specialArray(vector<int>& nums) { sort(nums.begin(), nums.end()); int n = nums.size(); for (int x = 0; x <= nums[n - 1]; x++) { // 枚舉 int l = 0, r = n -1 ; while (l < r) { // 二分 int m = (l + r) >> 1; if (nums[m] >= x) r = m; else l = m + 1; } if (nums[r] >= x && x == n - r) return x; } return -1; } };
- 時間復雜度:O(n log ?n),排序復雜度為O(n log? n),枚舉次數(shù)為值域范圍C=1000,所以找答案的復雜度為O(C log? n)
- 空間復雜度:O(log? n)
思路二:二分枚舉
二分枚舉+二分判定是否合法;
為了方便把判斷合法單獨寫成函數(shù)getResgetResgetRes。
Java
class Solution { int[] nums; public int specialArray(int[] num) { this.nums = num; Arrays.sort(nums); int l = 0, r = nums[nums.length - 1]; while (l < r) { int m = l + r >> 1; if (getRes(m) <= m) r = m; else l = m + 1; } return getRes(r) == r ? r : -1; } int getRes(int x) { int n = nums.length, l = 0, r = n - 1; while (l < r) { int m = l + r >> 1; if (nums[m] >= x) r = m; else l = m + 1; } return nums[r] >= x ? n - r : 0; } }
- 時間復雜度:O(n log? n),排序復雜度為O(n log ?n),二分找答案所以復雜度為O(log ?C log ?n)
- 空間復雜度:O(log ?n)
C++
- 注意全局變量和輸入變量需要有差別……
class Solution { public: vector<int> nums; int specialArray(vector<int>& num) { this->nums = num; sort(nums.begin(), nums.end()); int l = 0, r = nums[nums.size() - 1]; while (l < r) { int m = (l + r) >> 1; if (getRes(m) <= m) r = m; else l = m + 1; } return getRes(r) == r ? r : -1; } int getRes(int x) { int n = nums.size(), l = 0, r = n - 1; while (l < r) { int m = (l + r) >> 1; if (nums[m] >= x) r = m; else l = m + 1; } return nums[r] >= x ? n - r : 0; } };
- 時間復雜度:O(n log? n),排序復雜度為O(n log ?n),二分找答案所以復雜度為O(log? C log? n)
- 空間復雜度:O(log? n)
思路三:倒序枚舉
- 因為值域比較小,所以可以直接從值域最后開始倒著枚舉;
- 預處理出每個值出現(xiàn)的次數(shù),然后記錄當前合法合法數(shù)值的數(shù)量與當前數(shù)值進行比較。
Java
class Solution { public int specialArray(int[] nums) { int[] cnt = new int[1001]; for (int x : nums) cnt[x]++; for (int i = 1000, tot = 0; i >= 0; i--) { tot += cnt[i]; // 數(shù)量 if (i == tot) return i; } return -1; } }
- 時間復雜度:O(n+C)
- 空間復雜度:O(C)
C++
class Solution { public: int specialArray(vector<int>& nums) { int cnt[1001]; memset(cnt, 0, sizeof(cnt)); for (int x : nums) cnt[x]++; for (int i = 1000, tot = 0; i >= 0; i--) { tot += cnt[i]; if (i == tot) return i; } return -1; } };
- 時間復雜度:O(n+C)
- 空間復雜度:O(C)
以上就是Java C++ 算法題解leetcode1608特殊數(shù)組特征值的詳細內(nèi)容,更多關于Java C++ 算法特殊數(shù)組特征值的資料請關注腳本之家其它相關文章!
相關文章
用VC++6.0的控制臺實現(xiàn)2048小游戲的程序
本文是作者拜讀劉地同學的《C語言控制臺版2048》之后感覺非常不錯,添加了注釋之后分享給大家的,方便更多的初學者閱讀學習,有需要的小伙伴參考下。2015-03-03C++?JSON庫?nlohmann::basic_json::accept的用法解析
nlohmann::basic_json::accept 是 Nlohmann JSON 庫中的一個方法,它用于檢查一個字符串是否可以解析為有效的 JSON,這篇文章主要介紹了C++?JSON庫nlohmann::basic_json::accept的用法,需要的朋友可以參考下2023-06-06C/C++通過HTTP實現(xiàn)文件上傳與下載的示例詳解
WinInet是 Microsoft Windows 操作系統(tǒng)中的一個 API 集,用于提供對 Internet 相關功能的支持,它包括了一系列的函數(shù),使得 Windows 應用程序能夠進行網(wǎng)絡通信、處理 HTTP 請求、FTP 操作等,本文給大家介紹了C/C++通過HTTP實現(xiàn)文件上傳與下載,需要的朋友可以參考下2023-12-12