zoukankan      html  css  js  c++  java
  • 2.29

    1 到达终点

    https://leetcode-cn.com/problems/reaching-points/

     思路:暴力去做的话 无论是dfs或者bfs 从sx,sy到tx,ty去搜索 都会产生很多无效的状态 最后造成超时。通过题目发现 tx和ty中最大的那个数 肯定是由最小的那个数相加得来的,那么我们可以从tx,ty来反推 看一下是否可以变为sx,sy 。而我们发现 每次减去一个数之后如果还是比另一个数大 那么我们还需要减去一次 这样我们可以通过取模 一次算出结果。循环结束后,如果 tx < sx 或者 ty < sy,则不可能到达;如果 tx == sx,则我们判断 ty 与 sy 的差值是否能由 sx 拼凑而成;同理,如果 ty == sy,则我们判断 tx 与 sx 的差值是否能由 sy 拼成。

    java和c++代码如下:

    class Solution {
        public boolean reachingPoints(int sx, int sy, int tx, int ty) {
        while(sx<tx&&sy<ty){
               if(tx>ty) tx %= ty;
               else ty %= tx;
           }
           if(tx<sx||ty<sy) return false;
           if(tx==sx) return (ty-sy)%tx==0;
           return (tx-sx)%ty==0;
        }
    }
    class Solution {
    public:
        bool reachingPoints(int sx, int sy, int tx, int ty) {
            while (tx > sx && ty > sy) {
                if (tx < ty) ty %= tx;
                else tx %= ty;
            }
    
            if (tx < sx || ty < sy)
                return false;
    
            if (sx == tx)
                return (ty - sy) % sx == 0;
    
            return (tx - sx) % sy == 0;
        }
    };

    2 森林中兔子的数量

    https://leetcode-cn.com/problems/rabbits-in-forest/

     思路:如果兔子同一种颜色 那么他们说的数字x必然一样且这种颜色必然有x+1只兔子 我们统计每个数字出现的次数 如果数字x出现的次数是cnt

       1 如果cnt%(x+1)==0 那么一共有cnt/(x+1)种颜色 恰好有cnt只兔子说了x  

       2 如果cnt%(x+1)!=0 那么一共有cnt/(x+1)+1种颜色 有(cnt/(x+1)+1)*(x+1)只兔子 有cnt只兔子说了x 有(cnt/(x+1)+1)*(x+1)-cnt只兔子没有被问到

    java和c++代码:

    class Solution {
        public int numRabbits(int[] answers) {
            HashMap<Integer,Integer> map = new HashMap<>();
            for(Integer u:answers){
                if(map.containsKey(u)) map.put(u, map.get(u)+1);
                else map.put(u,1);
            }
            int res = 0;
            Set<Integer> integers = map.keySet();
            for(Integer u:integers){
                int cnt = map.get(u);
                if(cnt%(u+1)==0) res += cnt;
                else res += (cnt/(u+1)+1)*(u+1);
            }
            return res;
        }
    }
    class Solution {
    public:
        int numRabbits(vector<int>& answers) {
            unordered_map<int, int> seen;
            for (int x : answers)
                seen[x]++;
    
            int tot = 0;
            for (const auto &it : seen) {
                int x = it.first, num = it.second;
                if (num % (x + 1) == 0) tot += num;
                else tot += (num / (x + 1) + 1) * (x + 1);
            }
            return tot;
        }
    };
  • 相关阅读:
    C++ 用宏实现swap(a,b)
    C++ string类的实现
    博客园代码高亮Html转换小程序,Linux/Mac下可用
    C++STL
    数据结构课程设计(基于二叉排序树的身份证管理系统)
    简单模拟B1011
    简单模拟B1001
    双向链表的双向冒泡排序 c++
    IO流处理文件读取到字节数组,再从字节数组读取到文件,Java实现
    Java多人聊天室第一版
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14593472.html
Copyright © 2011-2022 走看看