Leetcode刷题笔记

Num1

C++暴力解

class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i,j; for(i=0;i<nums.size()-1;i++) { for(j=i+1;j<nums.size();j++) { if(nums[i]+nums[j]==target) { return {i,j}; } } } return {i,j}; }; };

两遍哈希表

class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int> a;//建立hash表存放数组元素 vector<int> b(2,-1);//存放结果 for(int i=0;i<nums.size();i++) a.insert(map<int,int>::value_type(nums[i],i)); for(int i=0;i<nums.size();i++) { if(a.count(target-nums[i])>0&&(a[target-nums[i]]!=i)) //判断是否找到目标元素且目标元素不能是本身 { b[0]=i; b[1]=a[target-nums[i]]; break; } } return b; }; };

一遍哈希表

class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int> a;//提供一对一的hash vector<int> b(2,-1);//用来承载结果,初始化一个大小为2,值为-1的容器b for(int i=0;i<nums.size();i++) { if(a.count(target-nums[i])>0) { b[0]=a[target-nums[i]]; b[1]=i; break; } a[nums[i]]=i;//反过来放入map中,用来获取结果下标 } return b; }; };

leetcode73

关键给imap插值

step1.

两重循环给二维数组赋初值,关键是给容器赋初值。

step2.

再进行两次二重循环遍历,分别对行和列进行覆盖。

分析:

时间复杂度O(n^2)

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        multimap<int,int> imap;
    for(int i = 0; i != matrix.size(); ++i) {
        for(int j = 0; j != matrix[0].size(); ++j) {
         if(matrix[i][j] == 0) {
             //imap = {i,j};
             imap.insert(make_pair(i,j));
         }
        }
    }
    for(auto it = imap.begin(); it != imap.end(); ++it) {
   for(int j = 0; j != matrix[0].size(); ++j){
       if(matrix[it->first][j]){
           matrix[it->first][j] = 0;
       }
   }
   for(int i = 0; i != matrix.size(); ++i) {
       if(matrix[i][it->second]){
           matrix[i][it->second] = 0;
       }
   }
    }

    }
};

leetcode49 字母异位分组

step1.这道题有难度,首先应该想到的是要把异构的字符串装到同一个字符串数组中,又要使这一数组具有同一共性。这里考虑使用C++中的unordered_map,遍历二维数组中的每一个字符串,并把排序后的该字符串作为mp的键,以后每有相同键值的字符串出现时就直接加到mp值(数组)的后面。

step2.

遍历mp,将mp的值加入到二维数组ans中。

附代码:

class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs){ unordered_map<string,vector<string>> mp; for(string& str : strs){ string key = str; sort(key.begin(),key.end()); mp[key].emplace_back(str); } vector<vector<string>> ans; for(auto it = mp.begin(); it != mp.end(); ++it) { ans.push_back(it->second); } return ans; } }; 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值