【LC刷题】DAY02:977 209 59

2024-06-07 13:28
文章标签 lc 刷题 day02 977 209 59

本文主要是介绍【LC刷题】DAY02:977 209 59,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#【LC刷题】DAY02:977 209 59

文章目录

    • 977. 有序数组的平方 [link](https://leetcode.cn/problems/squares-of-a-sorted-array/description/)
      • 第一思路:直接排序
      • 优化:双指针
    • 209. 长度最小的子数组 [link](https://leetcode.cn/problems/minimum-size-subarray-sum/description/)
      • 第一思路:
    • 59. 螺旋矩阵 II

977. 有序数组的平方 link

第一思路:直接排序

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {for(int i = 0; i <= nums.size() - 1; i ++  ){nums[i] = nums[i] * nums[i];}sort(nums.begin(),nums.end());return nums;}
};

时间复杂度:时间复杂度:O(nlog⁡n)
空间复杂度:O(log⁡n)

优化:双指针

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int n = nums.size();int negative = -1;for(int i = 0 ; i < n ; i++){if(nums[i] < 0){negative = i;}else{break;}}vector<int> ans;int i = negative, j = negative + 1;while(i >= 0 ||  j < n){if(i < 0){ans.push_back(nums[j] * nums[j]);++j;}else if (j == n){ans.push_back(nums[i] * nums[i]);--i;}else if(nums[i] * nums[i] < nums[j] * nums[j]){ans.push_back(nums[i] * nums[i]);--i;}else{ans.push_back(nums[j] * nums[j]);++j;}}return ans;}
};

时间复杂度:O(n)O(n)O(n)

空间复杂度:O(1)O(1)O(1)

209. 长度最小的子数组 link

第一思路:

class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {int n = nums.size();if (n == 0) {return 0;}int ans = INT_MAX;vector<int> sums(n + 1, 0); for (int i = 1; i <= n; i++) {sums[i] = sums[i - 1] + nums[i - 1];}for (int i = 1; i <= n; i++) {int target = s + sums[i - 1];auto bound = lower_bound(sums.begin(), sums.end(), target);if (bound != sums.end()) {ans = min(ans, static_cast<int>((bound - sums.begin()) - (i - 1)));}}return ans == INT_MAX ? 0 : ans;}
};

59. 螺旋矩阵 II

class Solution {
public:vector<vector<int>> generateMatrix(int n) {int maxNum = n * n;int curNum = 1;vector<vector<int>> matrix(n, vector<int>(n));int row = 0, column = 0;vector<vector<int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};  // 右下左上int directionIndex = 0;while (curNum <= maxNum) {matrix[row][column] = curNum;curNum++;int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];if (nextRow < 0 || nextRow >= n || nextColumn < 0 || nextColumn >= n || matrix[nextRow][nextColumn] != 0) {directionIndex = (directionIndex + 1) % 4;  // 顺时针旋转至下一个方向}row = row + directions[directionIndex][0];column = column + directions[directionIndex][1];}return matrix;}
};

时间复杂度:O( n 2 n^2 n2)

空间复杂度:O(1)

这篇关于【LC刷题】DAY02:977 209 59的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039299

相关文章

刷题——比较版本号

比较版本号_牛客题霸_牛客网 int compare(string version1, string version2){int len1 = version1.size();int len2 = version2.size();int i=0,j=0;while(i<len1 || j <len2){long num1 =0 ;while(i <len1 && version1.charAt

leetcode刷题(46)——236. 二叉树的最近公共祖先

这道题比235略难一些 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入:

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

leetcode刷题(44)——242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true 示例 2: 输入: s = “rat”, t = “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

leetcode刷题(43)——239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值------------

leetcode刷题(42)——703. 数据流中的第K大元素

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。 示例: int k = 3;int[] arr = [4,5,8,2];KthLargest kthLar

leetcode刷题(41)——232. 用栈实现队列

使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 示例: MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1queue.pop();

leetcode刷题(40)——83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 平时我们删除一个链表中的某个元素,一般都是以下的写法: temp.next = temp.next.next; 这样temp.next就被删除了 此题解法如下: class Solution

leetcode刷题(39)——反转链表 II

这道题可以说是非常难的,2中解法,迭代和递归,递归更加难想出来 解法1:迭代链接反转 算法 在看具体算法之前,有必要先弄清楚链接反转的原理以及需要哪些指针。举例而言,有一个三个不同结点组成的链表 A → B → C,需要反转结点中的链接成为 A ← B ← C。 假设我们有两个指针,一个指向结点 A,一个指向结点 B。 分别记为 prev 和 cur。则可以用这两个指针简单地实现 A 和 B

leetcode刷题(38)——142. 环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1