当前位置:   article > 正文

代码随想录算法训练营第二天 | Leetcode977,Leetcode209,Leetcode59

代码随想录算法训练营第二天 | Leetcode977,Leetcode209,Leetcode59

Leetcode977

题目:

写的贼长还Debug不出来的代码,后来发现我想手动快排不如直接调用Sort(),代码经验太少了——失败

自己写的垃圾代码:

  1. class Solution {
  2. public:
  3. vector<int> sortedSquares(vector<int>& nums) {
  4. int Size,left=0,right,i,tmp,A[10000],Zero,mid=1;
  5. Size=nums.size();
  6. right=Size-1;
  7. if(Size==1)
  8. {
  9. nums[0]= pow(nums[0],2);
  10. return nums;
  11. }
  12. if(nums[0]>0)
  13. return nums;
  14. for(i=0;i<Size-1;i++)
  15. {
  16. if(nums[i]<0&&nums[i+1]>=0)
  17. {
  18. Zero=i+1;
  19. }
  20. nums[i]=pow(nums[i],2);
  21. }
  22. left=Zero-1;
  23. right=Zero+1;
  24. A[0]=nums[Zero];
  25. while(left>=0&&right<Size-1)
  26. {
  27. if(left>0&&nums[left]<=nums[right])
  28. {
  29. A[mid++]=nums[left];
  30. left--;
  31. }
  32. if(right<Size-1&&nums[left]>nums[right])
  33. {
  34. A[mid++]=nums[right];
  35. right++;
  36. }
  37. if(left==0&&right==Size-1)
  38. {
  39. if(nums[left]>nums[right])
  40. {
  41. A[mid++]=nums[right];
  42. A[mid++]=nums[left];
  43. }
  44. else
  45. {
  46. A[mid++]=nums[left];
  47. A[mid++]=nums[right];
  48. }
  49. }
  50. }
  51. for(i=0;i<Size;i++)
  52. {
  53. nums[i]=A[i];
  54. }
  55. return nums;
  56. }
  57. };

暴力解法(复杂度O(nlogn)):

  1. class Solution {
  2. public:
  3. vector<int> sortedSquares(vector<int>& nums) {
  4. int Size,left=0,right,i,tmp,A[10000],Zero,mid=1;
  5. Size=nums.size();
  6. for(i=0;i<Size;i++)
  7. {
  8. nums[i]=pow(nums[i],2);
  9. }
  10. sort(nums.begin(), nums.end());
  11. return nums;
  12. }
  13. };

双指针解法:

  1. class Solution {
  2. public:
  3. vector<int> sortedSquares(vector<int>& nums) {
  4. int Size,left,right,A[10000],mid,i;
  5. Size=nums.size();
  6. left=0;
  7. right=Size-1;
  8. for(i=Size-1;i>=0;i--)
  9. {
  10. if(nums[left]*nums[left]<=nums[right]*nums[right])
  11. {
  12. A[i]=nums[right]*nums[right];
  13. right--;
  14. }
  15. else if(nums[left]*nums[left]>nums[right]*nums[right])
  16. {
  17. A[i]=nums[left]*nums[left];
  18. left++;
  19. }
  20. }
  21. for(i=0;i<Size;i++)
  22. {
  23. nums[i]=A[i];
  24. }
  25. return nums;
  26. }
  27. };

感悟:

  •  代码写少了,没想到直接可以调用快排sort(),导致手撕快排代码半天
  • 双指针没想到还可以这么用,以后继续加油熟悉

 Leetcode209

本人暴力解法:(似滑非滑)

  1. class Solution {
  2. public:
  3. int minSubArrayLen(int target, vector<int>& nums) {
  4. int left,right,Size,i,sum=0,lr;
  5. Size=nums.size();
  6. left=0;
  7. right=0;
  8. while(sum<target&&right<Size)
  9. {
  10. sum+=nums[right];
  11. right++;
  12. }
  13. lr=right;
  14. if(right==Size&&sum<target)
  15. {
  16. return 0;
  17. }
  18. else if(sum>=target&&right<=Size){
  19. while(right<=Size)
  20. {
  21. if(right<Size)
  22. sum+=nums[right++];
  23. while(sum-nums[left]>=target)
  24. {
  25. sum-=nums[left];
  26. left++;
  27. }
  28. if(lr>right-left)
  29. {
  30. lr=right-left;
  31. }
  32. if(sum-nums[left]<target&&right==Size)
  33. break;
  34. }
  35. }
  36. return lr;
  37. }
  38. };

滑动窗口 

  1. class Solution {
  2. public:
  3. int minSubArrayLen(int s, vector<int>& nums) {
  4. int result = INT32_MAX;
  5. int sum = 0; // 滑动窗口数值之和
  6. int i = 0; // 滑动窗口起始位置
  7. int subLength = 0; // 滑动窗口的长度
  8. for (int j = 0; j < nums.size(); j++) {
  9. sum += nums[j];
  10. // 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
  11. while (sum >= s) {
  12. subLength = (j - i + 1); // 取子序列的长度
  13. result = result < subLength ? result : subLength;
  14. sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
  15. }
  16. }
  17. // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
  18. return result == INT32_MAX ? 0 : result;
  19. }
  20. };

感悟:

  • 明白要更改滑动开始值和结束值,但是在窗口滑动上选择while并不明智,while的条件判断比For循环难找很多,对于每个元素都要查看的循环来说,for循环更加适合。 

Leetcode59 螺旋矩阵2

 标准解法

  1. class Solution {
  2. public:
  3. vector<vector<int>> generateMatrix(int n) {
  4. vector<vector<int>> array(n,vector<int>(n,0));
  5. int loop=n/2,i,j,m=1,s=0,n2=n*n,n3=n/2;
  6. int startx=0;
  7. int starty=0;
  8. while(loop--)
  9. {
  10. i=startx;
  11. j=starty;
  12. for(j=starty;j<n-m;j++)
  13. {
  14. array[startx][j]=(++s);
  15. }
  16. for(i=startx;i<n-m;i++)
  17. {
  18. array[i][j]=(++s);
  19. }
  20. for(;j>starty;j--)
  21. {
  22. array[i][j]=(++s);
  23. }
  24. for(;i>startx;i--)
  25. {
  26. array[i][j]=(++s);
  27. }
  28. startx++;
  29. starty++;
  30. m++;
  31. }
  32. if(n%2==1)
  33. {
  34. array[n3][n3]=++s;
  35. }
  36. return array;
  37. }
  38. };

感悟:

  • 遇见模拟的题目是一点也没头绪,没想到用这种循环的方式可以做,以后还是要对相关题目多加练习
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/836366
推荐阅读
相关标签
  

闽ICP备14008679号