剑指offer 第二版(101——119)(全部完结)

剑指 Offer II 101. 分割等和子集

 bool canPartition(vector& nums) {
        int sum=0;
        for(int i=0;i=nums[i-1];j--){
               // cout<

剑指 Offer II 102. 加减的目标值

bool canPartition(vector& nums) {
        int sum=0;
        for(int i=0;i=nums[i-1];j--){
               // cout<

 剑指 Offer II 103. 最少的硬币数目

int coinChange(vector& coins, int amount) {
        int n=coins.size();
        long f[amount+1];
        memset(f,0,sizeof(f));
        
       
            for(int j=0;j<=amount;j++) 
                f[j]=INT_MAX;
        
        f[0]=0;

        for(int i=1;i<=n;i++){
            for(int j=coins[i-1];j<=amount;j++){ 
               f[j]=min(f[j],f[j-coins[i-1]]+1);
            }
        }
        if(f[amount]==INT_MAX) return -1;
        return f[amount];
    }   

 剑指 Offer II 104. 排列的数目

注意这里如果用二维想法->前i个表示体积前j个表示前j个种类是区别不了组合数的,结果和前i个表示种类前j个表示前j个体积一样!!!如果想表示组合数则要化为一位数组。若要用二维解题可以用--->f[i][j]:所有从前i个位置中选,且总体积恰好是j的所有方案。这种想法解题,但是这种会多出一维出来。

int res=0;
    int combinationSum4(vector& nums, int target) {
        int n=nums.size();
        nums.insert(nums.begin(),0);
        int f[target+1];
        memset(f,0,sizeof(f));
        f[0]=1;
        for(int i=1;i<=target;i++){
            for(int j=1;j<=n;j++){
              if(i>=nums[j]&&f[i] < INT_MAX - f[i - nums[j]]) f[i]+=f[i-nums[j]];
            }
        }
        
        return f[target]; 
    }

 二维:

int combinationSum4(vector& nums, int target) {
        int n=nums.size();
        nums.insert(nums.begin(),0);
        int f[target+1][target+1];
        memset(f,0,sizeof(f));

        for(int i=0;i<=target;i++) f[i][0] =1;

        for(int i=1;i<=target;i++){
            for(int j=1;j<=target;j++){
                for(int k=1;k<=n;k++){
            if(j>=nums[k]&&f[i][j]

 剑指 Offer II 105. 岛屿的最大面积

int maxAreaOfIsland(vector>& grid) {
        int res=0;
        int n=grid.size(),m=grid[0].size();
        int sum=0;
        vector> st(n,vector(m));
        for(int i=0;i>grid,vector>& st){
        int n=grid.size(),m=grid[0].size();
        for(int i=0;i<4;i++){
            int X=x+dx[i],Y=y+dy[i];
            if(X>=n||X<0||Y>=m||Y<0||st[X][Y]||grid[X][Y]==0) continue;
            sum++;
            st[X][Y]=true;
            dfs(X,Y,sum,grid,st);
        }
    }

 剑指 Offer II 106. 二分图

vectorcolor;
    bool isBipartite(vector>& graph) {
        for(int i=0;i> graph){
        color[u]=c;
        for(int i=0;i

int ladderLength(string beginWord, string endWord, vector& wordList) {
        unordered_map dist;
        unordered_map map;
        wordList.push_back(beginWord);
        for(int i=0;i q;
        q.push(beginWord);
        dist[beginWord]=1;
        while(q.size()){
            auto cc=q.front();
            q.pop();
            string ori=cc;
            for(int i=0;i

 剑指 Offer II 108. 单词演变

int ladderLength(string beginWord, string endWord, vector& wordList) {
        unordered_map dist;
        unordered_map map;
        wordList.push_back(beginWord);
        
        for(int i=0;i q;
        q.push(endWord);
        dist[endWord]=1;
        while(q.size()){
            auto cc=q.front();
            q.pop();
            string ori=cc;
            for(int i=0;i

 剑指 Offer II 109. 开密码锁

 int openLock(vector& deadends, string target) {
        int res=0;
        unordered_map map;
        unordered_map dist;
        for(int i=0;iq;
        q.push("0000");
        dist["0000"]=1;
        while(q.size()){
            auto cc=q.front();
            
            q.pop();
            string ori=cc;
            for(int i=0;i<4;i++){ 
                cc=ori;
                if(cc[i]=='9') cc[i]='0';
                else cc[i]++;
                if(!map[cc]&&!dist[cc]){
                    dist[cc]=dist[ori]+1;
                    if(cc==target) return dist[cc]-1;
                    q.push(cc);
                }
                cc=ori;
                if(cc[i]=='0') cc[i]='9';
                else cc[i]--;
                if(!map[cc]&&!dist[cc]){
                    dist[cc]=dist[ori]+1;
                    if(cc==target) return dist[cc]-1;
                    q.push(cc);
                }
            }
        }
        return -1;
    }

 剑指 Offer II 110. 所有路径

vector> res;
    int n;
    vector> allPathsSourceTarget(vector>& graph) {
        if(graph.size()==0||graph[0].size()==0) return res;
        n=graph.size()-1;
        vectorxx;
        xx.push_back(0);
        dfs(0,graph,xx);
        return res;
    }
    void dfs(int u ,vector> graph,vector xx){
        if(xx.back()==n){
            res.push_back(xx);
            return ;
        } 
        for(int i=0;i

 剑指 Offer II 111. 计算除法

map,double> map;
    unordered_map f;
    vectorres;
    vector calcEquation(vector>& equations, vector& values, vector>& queries) {
        for(int i=0;i pss,pssf;
           pss.first=equations[i][0];pssf.first=equations[i][1];
           pss.second=equations[i][1];pssf.second=equations[i][0];
           map[pss]=values[i];
           map[pssf]=1.0/values[i];
           f[equations[i][0]]=true;
           f[equations[i][1]]=true;
        } 
        for(int i=0;i st;
            vector u=queries[i];
            string aa=u[0],bb=u[1];
            int sz=res.size();
            if(!f[aa]||!f[bb]) res.push_back(-1);
            else if(aa==bb&&f[aa]) res.push_back(1);
            else {
                if(i==queries.size()-1) cout<& st){
        if(aa==bb) {
            res.push_back(xx);
            return 1;
        }
        for(auto cc: map){
            if(st[aa]) continue;
            if(cc.first.first!=aa) continue;
            st[aa]=true;
            if(dfs(cc.first.second,bb,xx*cc.second,st)) return 1;
            st[aa]=false;
        }
        return 0;
    }

 剑指 Offer II 112. 最长递增路径

 int n,m;
    int cnt=0;
    int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
    vector> dist;
    vector> g;
    int longestIncreasingPath(vector>& matrix) {
        g=matrix;
        if (matrix.empty()) return 0;
        n=matrix.size(),m=matrix[0].size();
        dist=vector>(n,vector(m,0));
        int res=1;
        for(int i=0;i=n||y<0||y>=m||g[x][y]<=g[X][Y]) continue;
            dist[X][Y]=max(dist[X][Y],dfs(x,y)+1);
        }
        return dist[X][Y];
    }

剑指 Offer II 113. 课程顺序

vector findOrder(int numCourses, vector>& p) {       
        unordered_map> map;
        int n=p.size();
        vector d(numCourses);
        int head=0;
        int tt=-1,hh=0;
        for(int i=0;i q;vector res;
        for(int i=0;i

 剑指 Offer II 114. 外星文字典

 unordered_map map;
    string alienOrder(vector& words) {
        int cnt=0;
        int f[26]={0};
        int d[26]={0};
        queue q;
        string res;
        for(int i=0,j=1;jwords[j].size()){
                cout<<"xx";
                 return "";
            } 
        }
        for(int i=0;i

 剑指 Offer II 115. 重建序列

 bool sequenceReconstruction(vector& nums, vector>& p) {
        unordered_map> map;
        vector d(nums.size()+1);
        for(int i=0;i=1) return false;
            int cc=q[hh++];
            if(cc!=nums[loc++]) return false;
            for(int i=0;i

剑指 Offer II 116. 省份数量

int res=0;
    vectorst;
    vector> p;
    int n,m;
    int findCircleNum(vector>& pp) {
        p=pp;
        n=p.size(),m=p[0].size();
        st=vector(n);

        for(int i=0;i

 剑指 Offer II 117. 相似的字符串

 int n,m;
    int res;
    vectorp;
    int find(int u){
        if(p[u]!=u)  p[u]=find(p[u]);
        return p[u];
    }
    bool check(string  aa,string bb){
        if(aa==bb) return true;
        vector q;
        for(int i=0;i& strs) {
        int n=strs.size(),m=strs[0].size();
        res=n;
        p=vector(n);
        for(int i=0;i

 剑指 Offer II 118. 多余的边

vector p;
    int find(int u){
        if(p[u]!=u) p[u]=find(p[u]);
        return p[u];
    }
    vector findRedundantConnection(vector>& edges) {
        int n=edges.size();
        p.resize(n+1);
        for(int i=1;i<=n;i++) p[i]=i;

        for(auto e:edges){
           int aa=find(e[0]) ,bb=find(e[1]);
           if(aa!=bb) p[aa]=bb;
           else return  e;
        }
        return {};
    }

 剑指 Offer II 119. 最长连续序列

int longestConsecutive(vector& p) {
        set q(p.begin(),p.end());
        vector nums(q.begin(),q.end());
        int n=nums.size();
        int res=0;
        for(int i=0,j=0;i

你可能感兴趣的:(剑指向offer,算法,c++,开发语言)