LeetCode的medium题集合(C++实现)七

1 Rotate Image
You are given an n x n 2D matrix representing an image.Rotate the image by 90 degrees (clockwise).
对于 n x n 的矩阵按顺时针旋转90度,相当于先将矩阵上下翻转,然后将矩阵装置。

void rotate(vector<vector<int>>& matrix) {
        if (matrix.empty()) return;
        int len=matrix.size(),temp;
        for(int i=0;i<len/2;i++)
        {
            for(int j=0;j<len;j++)
            {
                temp=matrix[len-1-i][j];
                matrix[len-1-i][j]=matrix[i][j];
                matrix[i][j]=temp;
            }
        }
        for(int i=0;i<len;i++)
        {
            for(int j=0;j<i;j++)
            {
               temp=matrix[i][j];
               matrix[i][j]=matrix[j][i];
               matrix[j][i]=temp;
            }
        }
        return;
    }

对于长宽不等的图像旋转任意角度,常规方法是利用点的旋转变换公式:
[x;y]=[cos(t)sin(t);sin(t)cos(t)][x;y] . 变换后图片中的每个像素点需要平移到相对旋转中心的新坐标,计算完成之后,需要再次还原到相对左上角原点的旧坐标。

vector<vector<int>> Rotate(vector<vector<int>>& matrix, float angle)
{
  int len = (int)(sqrt(pow(matrix.size(), 2) + pow(matrix[0].size(), 2)) + 0.5);

  vector<vector<int> > retMat(len,vector<int>(len,0);
  float anglePI = angle * CV_PI / 180;
  int xSm, ySm;

  for(int i = 0; i < retMat.size(); i++)
    for(int j = 0; j < retMat.size(); j++)
    {
      xSm = (int)((i-retMat.size()/2)*cos(anglePI) - (j-retMat..size()/2)*sin(anglePI) + 0.5);
      ySm = (int)((i-retMat.size()/2)*sin(anglePI) + (j-retMat..size()/2)*cos(anglePI) + 0.5);
      xSm += matrix.size() / 2;
      ySm += matrix[0].size() / 2;

      if(xSm >= matrix.size() || ySm >= matrix[0].size() || xSm <= 0 || ySm <= 0){
        retMat[i, j] = Vec3b(0, 0);
      }
      else{
        retMat[i, j] = matrix[xSm, ySm];
      }
    }

  return retMat;
}

2 Anagrams

Given an array of strings, return all groups of strings that are anagrams.Note: All inputs will be in lower-case.
anagrams指的是字符相同只是顺序不同的字符串。我们先对每一个字符串排序,将排序后的字符串作为字典的key值,将排序前的字符串做为value值。然后遍历字典,如果value值大于1怎构成anagrams。

vector<string> anagrams(vector<string>& strs) {
        vector<string> ret;  
        map<string,vector<string> >m;  
        for(int i = 0 ; i < strs.size() ; i++)  
        {  
            string tmp=strs[i];  
            sort(tmp.begin(),tmp.end());  
            m[tmp].push_back(strs[i]);  
        }  
        for(map<string,vector<string> >::iterator it = m.begin(); it != m.end(); it++)  
        {  
            if ( (it->second).size() > 1 )  
            {  
                for(vector<string>::iterator it1 = (it->second).begin(); it1!= (it->second).end(); it1++)  
                    ret.push_back(*it1);  
            }  
        }  
        return ret;  
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值