977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

 

977.有序数组的平方

思路:

分别 从 数组 的 左 , 右 向 另一侧 / 中间 趋近,

新 建立 一个 数组 接收 (有序 序列) (动态 地 在 过程 中 接收 数据)

 

 

拓展 为 各个 任务 分配 工作 指针 , 形成 多指针

有序 数字 序列 ,使用 双指针 从 两侧 趋近 , 可以 有效 地 转化 为 绝对值 序列 , (从 放置 “大” 绝对值 得 位置 开始 写入 (可以 是 从右往左))

 

vector<int> sortedSquares(vector<int>& nums) {
       int len = end(nums) - begin(nums);

       int i = 0;
       int j = len - 1 ;
       int k = len - 1;

       vector<int> TempReceive(len,0);

       int Temp_Cache_Left = nums[i]*nums[i];
       int Temp_Cache_Right = nums[j]*nums[j];

       while(i <= j)
      {


           //内循环
           if((Temp_Cache_Left) >= (Temp_Cache_Right)       )         // 基础逻辑 与 代码 优化          
          {
               TempReceive[k] = Temp_Cache_Left;
               k--;
               i++;
               if(i < len)         //防 溢出
              {  
                   Temp_Cache_Left = nums[i]*nums[i];
              }

          }
           else
          {
               TempReceive[k] = Temp_Cache_Right;
               k--;
               j--;

               if(j >= 0 )
              {
                   Temp_Cache_Right = nums[j]*nums[j];
              }

          }

      }


       return TempReceive;

  }

 

 

209.长度最小的子数组
int minSubArrayLen(int target, vector<int>& nums) {
       int len = end(nums) - begin(nums);

       int i = 0;
       int j = -1;

       int sum = 0;

       int tempSum = 0;

       // “ j “轮个” 查询 ”
       // i 趋近 到 不能 趋近 的 程度

       int temp_mini_len = -1;

       int Cache_Target_len = 0;

                   // “快速 略过 / 跳过 sum 还 不满足 时 的 情况”
       
       do
      {
           j++;
           if(j >= len)
          {
               break;
          }
           else
          {
               tempSum = tempSum + nums[j];
          }
           
      }while(j<len && tempSum < target );

       if(j<len)       // 防 溢出   , 注意 边界
      {

           if(tempSum >= target)
          {

               Cache_Target_len = j - i +1;
          }
       

           do
          {
               //内循环

               // 预处理 操作 / 操作区

               while( i < j )
              {
                   tempSum = tempSum - nums[i];

                   if(tempSum >= target)
                  {
                       // Storage

                       // Update i ;

                       i++;

                       //keep check

                  }
                   else
                  {
                       tempSum = tempSum + nums[i];        // 回 退 操作
                       break;
                  }

              }

               temp_mini_len = (j - i + 1);

               if(temp_mini_len < Cache_Target_len)
              {

                   Cache_Target_len = temp_mini_len;
              }

               if(j+1 < len)
              {
                   j++;

                   tempSum = tempSum + nums[j];

                   // 这里 似乎 用不到 回溯法
                   
              }
               else
              {
                   break;
              }      

          }while(j < len);

      }
       
       return Cache_Target_len;


  }

 

 

时间 吃紧 , 先把 练习 代码 贴上 , 随后 补充 细节 / 思路 , “解题” 时 的 情况 / 环境 , 总结

 

 

59.螺旋矩阵II
vector<vector<int>> generateMatrix(int n) {
       // n   “ 边长 ”

       int count = 0;

       int i = 0;
       int j = 0;

       int k = 0;

       int len_Edge = n;

       vector<vector<int>> CacheSpiralMatrix(n , vector<int>(n , 0));

       //内循环

       // 注意 螺旋 矩阵 的 结构

       // 区分 奇偶 情况

       if((n % 2) == 0 )
      {
           while(len_Edge > 0)
          {
               for(k = 0 ; k < (len_Edge-1) ; k++ )
              {
                   count++;
                   CacheSpiralMatrix[i][j] = count;
                   j++;
              }

               for(k = 0 ; k < (len_Edge-1) ; k++ )
              {
                   count++;
                   CacheSpiralMatrix[i][j] = count;
                   i++;
              }

               for(k = 0 ; k < (len_Edge-1) ; k++ )
              {
                   count++;
                   CacheSpiralMatrix[i][j] = count;
                   j--;
              }

               for(k = 0 ; k < (len_Edge-1) ; k++ )
              {
                   count++;
                   CacheSpiralMatrix[i][j] = count;
                   i--;
              }

               i++;
               j++;

               len_Edge -= 2 ;          //len_Edge = len_Edge - 2;

          }
      }
       else
      {
           while(len_Edge > 1)
          {
               for(k = 0 ; k < (len_Edge-1) ; k++ )
              {
                   count++;
                   CacheSpiralMatrix[i][j] = count;
                   j++;
              }

               for(k = 0 ; k < (len_Edge-1) ; k++ )
              {
                   count++;
                   CacheSpiralMatrix[i][j] = count;
                   i++;
              }

               for(k = 0 ; k < (len_Edge-1) ; k++ )
              {
                   count++;
                   CacheSpiralMatrix[i][j] = count;
                   j--;
              }

               for(k = 0 ; k < (len_Edge-1) ; k++ )
              {
                   count++;
                   CacheSpiralMatrix[i][j] = count;
                   i--;
              }

               i++;
               j++;

               len_Edge -= 2 ;          //len_Edge = len_Edge - 2;

          }

           // “ len_Edge == 1 时 ”

           count++;
           CacheSpiralMatrix[i][j] = count;

      }




       return CacheSpiralMatrix;




  }
 

 

 

posted @ 2023-12-01 18:24  晴夜空  阅读(47)  评论(0)    收藏  举报