回顾前面刷过的算法(3)

今天简单描述了一下算法思路并手敲了一下下面三个算法,算法题目是刷不完的,但是解题思想是有限的,我们需要学习的就是解题思想,代码展示如下

    //打家劫舍
    //思路: 定义一个dp[i],表示偷前 i - 1 个房屋能偷到的最大金额
    //则有递推关系式 dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1])
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int pre = 0, curr = nums[0];
        for (int i = 2; i <= nums.length; i++) {
            int temp = Math.max(curr, pre + nums[i - 1]);
            pre = curr;
            curr = temp;
        }
        return curr;
    }


    //多数元素
    //思路: 方法有很多,这里采用的是每次消除两个不同元素,因为多数元素的数量是大于总数的一半
    //所以消除到最后,剩余的元素一定是多数元素
    public int majorityElement(int[] nums) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int count = 0, currentNum = -1;
        for (int num : nums) {
            if (count == 0) {
                currentNum = num;
                count++;
            } else {
                if (num == currentNum) {
                    count++;
                } else {
                    count--;
                }
            }
        }
        return currentNum;
    }
  
    
    //LRU缓存
    //思路: 采用双链表+HashMap实现,hashMap存储key与结点的对应关系便于查找,
    //双链表存储结点便于增删
    class LRUCache {
        private int size;
        private final int capacity;
        private final DLinkedNode head;
        private final DLinkedNode tail;
        private final Map<Integer, DLinkedNode> cache = new HashMap<>();

        class DLinkedNode {
            int key;
            int value;
            DLinkedNode next;
            DLinkedNode pre;

            public DLinkedNode() {
            }

            public DLinkedNode(int _key, int _value) {
                key = _key;
                value = _value;
            }
        }

        public LRUCache(int capacity) {
            this.size = 0;
            this.capacity = capacity;
            head = new DLinkedNode();
            tail = new DLinkedNode();
            head.next = tail;
            tail.pre = head;
        }

        public int get(int key) {
            DLinkedNode node = cache.get(key);
            if (node == null) {
                return -1;
            }
            //因为操作过,需要把它移动到双链表头部
            moveToHead(node);
            return node.value;
        }

        public void put(int key, int value) {
            DLinkedNode node = cache.get(key);
            if (node == null) {
                DLinkedNode newNode = new DLinkedNode(key, value);
                cache.put(key, newNode);
                addToHead(newNode);
                size++;
                if (size > capacity) {
                    DLinkedNode temp = removeTail();
                    cache.remove(temp.key);
                    size--;
                }
            } else {
                node.value = value;
                moveToHead(node);
            }
        }

        private void moveToHead(DLinkedNode node) {
            removeNode(node);
            addToHead(node);
        }

        private void removeNode(DLinkedNode node) {
            node.next.pre = node.pre;
            node.pre.next = node.next;
        }

        private void addToHead(DLinkedNode node) {
            node.next = head.next;
            node.pre = head;
            head.next.pre = node;
            head.next = node;
        }

        private DLinkedNode removeTail() {
            DLinkedNode temp = tail.pre;
            removeNode(temp);
            return temp;
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值