【LeetCode-算法入门】第2天:双指针
📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
文章目录
- 前言
-
- 🚀 977. 有序数组的平方
-
- 🌈 1. 题目
- 🌈 2. 答案
- 🚀 189. 轮转数组
-
- 🌈 1. 题目
- 🌈 2. 答案
前言
算法是程序员的内功,掌握算法不仅能帮助你在面试中过关斩将,赢取 Dream Offer,更能充分锻炼你的逻辑思维与底层能力,我是一名忠实的 Leetcode 用户,积累的一些个人经验,尽可能地帮助大家少走弯路。
🚀 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] <= 104nums 已按 非递减顺序 排序进阶:请你设计时间复杂度为 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 - 10 <= 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)
备战秋招,LeetCode算法大总结,啃下这块硬骨头
https://jeames.blog.csdn.net/article/details/124919920
开发者涨薪指南
48位大咖的思考法则、工作方式、逻辑体系