04 arts打卡第四周

Algorithm

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

解题思路:

先对这个数组进行排序,怎么找出不重复的元素比较关键,之前想把符合的3个元素中的前两项存起来,然后每次去查询,当然集合选择的是hash类型,但是执行后,超过了例子的执行时间,说明效率还是很低,后来苦思冥想,终于想到了最佳的方式去查看重复元素,就是做标记,既然是排好序的,遍历哪一层,只要和之前遍历的前一层元素重复,那就没必要往后执行了,直接跳出循环,当然了,我一直在怎么存储思考打转,还可以从怎么遍历思考进行优化

public static List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> list = new LinkedList<>();
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }
        Integer a = null;
        for (int i = 0; i < nums.length - 2; i++) {
            if (a!=null&&a == nums[i]) {
                continue;
            }

            Integer b = null;
            for (int j = i + 1; j < nums.length - 1; j++) {
                if (b!=null &&b == nums[j]) {
                    continue;
                }
                Integer index = map.get(0 - nums[i] - nums[j]);
                if (index != null && index > j) {
                    List<Integer> threeList = new LinkedList<>();
                    threeList.add(nums[i]);
                    threeList.add(nums[j]);
                    threeList.add(nums[index]);
                    list.add(threeList);
                }
                b = nums[j];
                continue;
            }
            a = nums[i];
        }
        return list;
    }

Review

redis官方实现Redis分布式锁

Tip

最近看了网络基础,原来vlan就是对一个广播域lan进行拆分,说白了就是交换机的网络隔离。

Share

Redis分布式锁的实现demo

String LOCK = "lock";
        while (true) {
            RLock lock = redisson.getLock(LOCK);
            boolean isLock = false;
            try {
                isLock = lock.tryLock(500, 1500, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (isLock) {
                try {
                    //业务代码
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                    //如果某个线程超时了,自动释放锁,在解锁时会抛出异常,可以捕获这个异常进行回滚操作
                }
            } else {
                long end = System.currentTimeMillis();
                if (end - begin > 300000) {
                   //如果超时,进行业务处理
                }
                continue;
            }
            break;
        }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • redis是一个以key-value存储的非关系型数据库。有五种数据类型,string、hashes、list、s...
    林ze宏阅读 1,029评论 0 0
  • 五种数据结构简介 Redis是使用C编写的,内部实现了一个struct结构体redisObject对象,通过结构体...
    彦帧阅读 7,010评论 0 14
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,877评论 0 10
  • 排序算法几种分类方式: 1,稳定排序和不稳定排序 如果a==b, 当排序之前a在b的前面,排序后,a仍然在b...
    fly_ever阅读 447评论 0 0
  • 转载自:https://egoistk.github.io/2016/09/10/Java%E6%8E%92%E5...
    chad_it阅读 1,012评论 0 18