将路径数组变为统计数组

给定一个路径数组paths,表示一张图。
paths[i]==j代表城市i连向城市j,如果paths[i]==i表示i城市是首都,一张图里只会有一个首都,不会有分图且图中除了首都指向自己之外不会有环;
例如:paths={9,1,4,9,0,4,8,9,0,1} 由这个数组表示的图如下图所示。
城市1是首都所以距离为0;离首都距离为1的城市只有城市9;离首都距离为2的城市有城市0,3,7;离首都距离为3的城市有城市4,8;离首都距离为4的城市有城市2,5,6; 所以,距离为0的城市有1座;距离为1的城市有1座;距离为2的城市有3座;距离为3的城市有2座;距离为4的城市有3座;那么统计数组为numArr={1,1,3,2,3,0,0,0,0,0},numArr[i]==j代表距离为i的城市有j座; 要求实现一个void类型的函数,输入一个路径数组paths,直接在原数组上调整,使之变为numArr数组。 paths={9,1,4,9,0,4,8,9,0,1},函数处理后,paths={1,1,3,2,3,0,0,0,0,0}。 要求:如果paths长度为N,时间复杂度为O(N),额外空间复杂度为O(1);
这里写图片描述

class Solution {
public:
  /**
   *  将路径数组变为统计数组
   *  输入:代表一张图的数组paths
     *  len path的长度
   *  将paths数组变为距离数组numArr
   */
  void pathArrToNumArr(vector<int>& paths,int len) {
        int k;
        for(int i=0;i<len;i++)
            {if(paths[i]==i)k=i;
             paths[i]=paths[i]*len;
            }
        for(int i=0;i<len;i++)
       { int t=i;int pathlen=0;
        while(t!=k)
        { //path[i]+=len;
           t= paths[t]/len;
          pathlen+=1;
        }
        ++paths[pathlen];
       }
        if(1!=len)
        for(int i=0;i<len;i++)paths[i]=paths[i]%len;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值