classSolution: defisIdealPermutation(self, nums: List[int]) -> bool: g, l = 0, 0 n = len(nums) for i inrange(0, n - 1): for j inrange(i + 1, n): x1, x2 = nums[i], nums[j] if i + 1 == j and x1 > x2: l += 1 flag = True g += 1if x1 > x2 else0 return g == l
维护最小后缀
1 2 3 4 5 6 7 8 9 10
classSolution: defisIdealPermutation(self, nums: List[int]) -> bool: min_suf = nums[-1] for i inrange(len(nums) - 2, 0, -1): if nums[i - 1] > min_suf: returnFalse min_suf = nums[i] if nums[i] < min_suf else min_suf # for loop 中调用function开销很大 # min_suf = min(min_suf, nums[i]) returnTrue
C++
模拟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: boolisIdealPermutation(vector<int>& nums){ int g = 0, l = 0; int n = nums.size(); for (int i = 0; i < n - 1; ++i) { for (int j = i + 1; j < n; ++j) { int x1 = nums[i], x2 = nums[j]; if (i + 1 == j && x1 > x2) ++l; if (x1 > x2) ++g; } } return g == l; } };
维护最小后缀
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { public: boolisIdealPermutation(vector<int>& nums){ int n = nums.size(); int suf_min = nums[n - 1]; for (int i = n - 2; i > 0; --i) { if (suf_min < nums[i - 1]) returnfalse; // if (nums[i] < suf_min) suf_min = nums[i]; suf_min = min(nums[i], suf_min); } returntrue; } };
注意:
无论哪个语言,在for loop(循环)中调用函数开销都是很大的,我们应该避免在 for loop 中调用函数