24年1.26总结数组相关知识

文章探讨了在有序数组中删除特定元素的两种方法:暴力遍历和双指针法。同时介绍了如何利用双指针计算有序数组中平方和最大的子数组和求解长度最小的子数组问题,以及构建螺旋矩阵的算法。
摘要由CSDN通过智能技术生成
  • 二分查找
  • 删除数组中的元素
  • 有序数组的平方
  • 长度最小的子数组
  • 螺旋矩阵

删除数组中的元素

两种方法:1.暴力遍历:可以采用两个循环(嵌套使用),外层循环进行遍历,遇到要删除的元素就进行内层循环(用来把删除元素覆盖掉),

                   

      for (int i = 0; i < size; i++) {


            if (a[i] == target) { // 发现需要移除的元素,就将数组集体向前移动一位

                for (int j = i + 1; j < size; j++) {

                        a[j - 1] = a[j];

                }
                i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                        要不然会少判断现在这个位置上的数是否需要移除。

                size--; // 此时数组的大小-1
      

                }

                  2.双指针法:slow和fast   fast用来遍历将要删除的数和不需要删除的数区分开,slow作为数组下标,当fast遇到需要留下的数,slow才会更新

for(fast=0;fast<size;fast++)
{

   if(a[fast]!=target)   //遇到被删的元素会跳过 ,这样可以完成元素的覆盖
      {
        
         a[slow]=a[fast];
           
          slow++;

      }



}

有序数组的平方

平方的最大值肯定从两端开始取(有序),可能含有负数,所以用双指针法

双指针法:两端都来一个指针,比较两个指针所指的数的大小,取大的数优先放进新的数组中

   int k=size-1;  //先取的是最大值,所以先从最后边开始,

   for(int i=0;j=size-1;i<=j)    //取等号的原因是当i与j相等时的数不能漏掉
   
   {
       if(a[i]*a[i]>a[j]*a[j])
     
          {
            result[k--]=a[i]*a[i];
        
                i++;

          }
           
        else{
               result[k--]=a[j]*a[j];

                 j--;


            }

   }

长度最小的子数组

双指针法:一个指针( i )控制终止位置,另一个指针 ( j ) 控制起始位置,j 先位于开头位置不动, i 不断向后移,直到 i 与 j 之间的数值总和大于s,然后 i 不动,控制 j 向后走,直到满足条件时所需的最小长度。

//伪代码
       int result=9999999;

    for(i=0;i<size;i++)

       {
          sum+=a[i];//i与j之间的总和
     
           while(sum>s)  //用while不用if是因为不能判断减去一个起始位置的数值剩下的长度是否是最小的长度。

             {
                 L=i-j+1;//i与j之间的长度
                
                 if(L<result)
                   {
                      result=L;
                   }
                  
                   sum-=a[j]; 
  
                   j++;//起始位置移动,缩短长度。

              }




       }

螺旋矩阵

//伪代码  先规定为左闭右开

start=0;
offset=1;
count=1;//数值

  while(n/2)   //n/2为所需要转的圈数
  {
    
     //然后开始转圈,只要搞明白第一圈,后边的圈是一样的
    
     for(j=start;j<n-offset;j++)  //因为每一圈开始的位置不一样,所以j最开始的位置不能固定,所以j=startx,并且越往内圈走j最后的值逐渐减小,所以j<n-offset,(从左至右)
          a[start][j]=count++;

     for(i=start;i<n-offset;i++)
   
          a[i][j]=count++;//因为此时的j在最后一个位置,所以直接是j了

  
     for(;j>start;j--)
       
          a[i][j]=count++;

     for(;i>start;i--)
       
          a[i][j]=count++;
       
   start++;offset++;
   
    }


   if(n%2==1)
   {
     a[start][start]=count;
   }

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值