ARTS 2019 02 09 (17)

68 篇文章 0 订阅
49 篇文章 0 订阅

ARTS
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Tech:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章;

Algorithm

155. 最小栈

https://leetcode-cn.com/problems/min-stack/
这题简单来说就是要比别的栈多出一个功能,可以取到最小值。
看似很简单的功能,本来以为只要多个记录当前最小值的变量就行来,但是最大的问题就在于,出栈的时候,万一吧当前最小的给出了,那么当前最小的上一个的最小值咱们是没有记录的,所以咱们这里最简单的方法就是用两个栈来实现这个功能。
(1)一个栈用来放数据。
(2)一个栈用来放最小值。
反正题目也没有说明空间复杂度的限值。OK,Show the code:

class MinStack {

    LinkedList<Integer> originList;
    LinkedList<Integer> minValueList;
    /** initialize your data structure here. */
    public MinStack() {
         originList = new LinkedList<>();
         minValueList = new LinkedList<>();
    }
    
    public void push(int x) {
        if (originList.size() == 0 || minValueList.size() == 0 ||minValueList.getLast() >= x) {
            minValueList.addLast(x);
        } 
        originList.addLast(x);
    }
    
    public void pop() {
        int temp = originList.removeLast();
        if (temp == minValueList.getLast()) {
            minValueList.removeLast();
        }
    }
    
    public int top() {
        return originList.getLast();
    }
    
    public int getMin() {
        return minValueList.getLast();
    }
}

}

本来这里我还找到一种可以通过存一个变量,然后根据计算得到每次弹出栈的方法,但是,用例都跑不过,因为会出现溢出的情况。

540. 有序数组中的单一元素

https://leetcode-cn.com/problems/single-element-in-a-sorted-array/

给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: [3,3,7,7,10,11,11]
输出: 10
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。

因为题目已经规定的非常明确了,时间复杂度只能是O(log n),所以,这里只能使用二分查询的方法来做。
二分查询需要注意的就是判断清楚,到底那个单一的元素是在左边还是在右边。首先我们要明确一下几个概念:
(1)数组的长度肯定是单数的,因为只有一个单个元素,其他的元素都是双数,
(2)左边和右边的判断:这里有两个判断因素:
1、跟 中点位置的值 相同的值到底是在左边还是右边;
2、如果中点是个单数,那么如果于中点想同的值在左边,那么意味着,那个单个的值在右边;
3、如果中点是个单数,那么如果于中点想同的值在右边,那么意味着,那个单个的值在左边;
4、如果中点是个双数,那么如果于中点想同的值在左边,那么意味着,那个单个的值在左边;
5、如果中点是个单数,那么如果于中点想同的值在右边,那么意味着,那个单个的值在右边;
这里理解一个诀窍,就是肯定是剩下单数个的值会产生我们需要寻找的目标。
OK,Show the code:

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int low = 0;
        int high = nums.length - 1;
        while (low < high) {
            int mid = (low + high) / 2;
            // 如果中点是个双数
            if (mid % 2 == 0) {
            //   那么如果于中点想同的值在右边
                if (nums[mid] == nums[mid + 1]) {
                	//单个的值在右边,修改low指标
                    low = mid + 2;
           //    那么如果于中点想同的值在左边
                } else if (nums[mid] == nums[mid - 1]) {
                	//单个的值在右边,修改high指标
                    high = mid - 2;
                } else {
                    return nums[mid];
                }
         // 如果中点是个单数
            } else {
            //  如果于中点想同的值在右边
                if (nums[mid] == nums[mid + 1]) {
            // 单个的值在左边
                    high = mid - 1
               // 中点想同的值在左边    
                } else if (nums[mid] == nums[mid - 1]) {
                // 那个单个的值在右边
                    low = mid + 1;
                } else {
                    return nums[mid];
                }
            }

        }
        return nums[low];
    }
}

Review

https://www.ibm.com/developerworks/library/it-haggar_bytecode/index.html
Java bytecode: Understanding bytecode makes you a better programmer
弄明白字节码能让你成为更好的程序员
耗叔的推荐的关于Java字节码的第二篇文章,这篇文章没有第一篇那么详细说明了关于Java字节码的一系列操作数栈的调用过程。这篇文章的主题的更加注重用一些简单的例子告诉你为啥子我们要学习字节码。
主要有几个原因:
(1)熟悉字节码,可以帮助我们写出运行效率更好的代码。
(2)程序员熟悉字节码可以更加迅速的定位到问题的所在,总之就是很有用的。
结合上一篇我看到的文章,最重要的就是事件,实践比什么都重要!!!看了再多不如自己动手跑一跑。

Tip/Tech

手写了一个二分查找,发现写好这个还是挺难的,平时没用到,需要多加练习。
查看字节码文件。

Share

https://towardsdatascience.com/a-machine-learning-approach-building-a-hotel-recommendation-engine-6812bfd53f50
A Machine Learning Approach — Building a Hotel Recommendation Engine
这篇文章,怎么说呢,没啥算法的解释,就是简单的教你如何一步一步入门这个推荐算法。
但是也没有对算法有解释,纯粹依赖第三方算法库,也没啥调优。
如果没有用过这个,真心的看的蛋疼。
但是学习到了如何一步一步的简单分析。也算是没有白看吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值