🚀 977. 有序数组的平方
🌈 1. 题目
🚀 题目 给你一个按 非递减顺序 排序的整数数组 nums, 返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100] 示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121] 提示: 1 <= nums.length <= 104 -104 <= nums[i] <= 104 nums 已按 非递减顺序 排序 进阶: 请你设计时间复杂度为 O(n) 的算法解决本问题
🌈 2. 答案
📢📢 C++
class Solution { public: vector<int> sortedSquares(vector<int>& A) { for (int i = 0; i < A.size(); i++) { A[i] *= A[i]; } sort(A.begin(), A.end()); // 快速排序 return A; } };
📢📢 Java
class Solution { public int[] sortedSquares(int[] nums) { int right = nums.length - 1; int left = 0; int[] result = new int[nums.length]; int index = result.length - 1; while (left <= right) { if (nums[left] * nums[left] > nums[right] * nums[right]) { result[index--] = nums[left] * nums[left]; ++left; } else { result[index--] = nums[right] * nums[right]; --right; } } return result; } }
📢📢 Python
class Solution: def sortedSquares(self, nums: List[int]) -> List[int]: n = len(nums) i,j,k = 0,n - 1,n - 1 ans = [-1] * n while i <= j: lm = nums[i] ** 2 rm = nums[j] ** 2 if lm > rm: ans[k] = lm i += 1 else: ans[k] = rm j -= 1 k -= 1 return ans
🚀 189. 轮转数组
🌈 1. 题目
难度系数:🚩🚩 🚀 题目 给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4] 示例 2: 输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100] 提示: 1 <= nums.length <= 105 -231 <= nums[i] <= 231 - 1 0 <= k <= 105 进阶: 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
🌈 2. 答案
📢📢 C++
思路:此题可以采用头插法,一个一个的移动。但是有种更加简单的选择数组的方式。 我们可以采用翻转的方式,比如12345经过翻转就变成了54321,这样已经做到了把前面的数字放到后面去,但是还没有完全达到我们的要求, 比如,我们只需要把12放在后面去,目标数组就是34512,与54321对比发现我们就只需要在把分界线前后数组再进行翻转一次就可得到目标数组了。 所以此题只需要采取三次翻转的方式就可以得到目标数组,首先翻转分界线前后数组,再整体翻转一次即可。 此题面试常考,大家可以记一下此方法。 class Solution { public: void reverse(vector<int>& nums,int begin,int end) { int temp; while(begin<end){ temp = nums[begin]; nums[begin] = nums[end]; nums[end] = temp; begin++; end--; } } void rotate(vector<int>& nums, int k) { if(nums.size()<2) return; k %=nums.size(); reverse(nums,0,nums.size()-1); reverse(nums,0,k-1); reverse(nums,k,nums.size()-1); } };
📢📢 Java
class Solution { private void reverse(int[] nums, int start, int end) { for (int i = start, j = end; i < j; i++, j--) { int temp = nums[j]; nums[j] = nums[i]; nums[i] = temp; } } public void rotate(int[] nums, int k) { int n = nums.length; k %= n; reverse(nums, 0, n - 1); reverse(nums, 0, k - 1); reverse(nums, k, n - 1); } }
📢📢 Python
class Solution: def rotate(self, A: List[int], k: int) -> None: def reverse(i, j): while i < j: A[i], A[j] = A[j], A[i] i += 1 j -= 1 n = len(A) k %= n reverse(0, n - 1) reverse(0, k - 1) reverse(k, n - 1)