LeetCode笔记

126 阅读1分钟

Map

Map<Integer,Integer> map = new HashMap<>();

map.containsKey(key);
map.get(key);
map.put(key,value);
map.remove(key);

Set

Set <Integer> set = new HashSet<>();
set.contains(content);
set.add(content);

  • HashSet是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null。add(),remove(),contains()方法的时间复杂度是O(1)。
  • TreeSet 是排序二叉树(红黑树)实现的,Treeset中的数据是自动排好序的,不允许放入null值。 add(),remove(),contains()方法的时间复杂度是O(logn)。
  • HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。
  • 两者中的值都不能重复,就如数据库中唯一约束。

LinkedList ArrayList

  • 数据结构
    1. ArrayList是Array(动态数组)的数据结构。
    2. LinkedList是Link(双向链表)的数据结构。
  • 效率
    1. get和set操作。ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
    2. add和remove。LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
  • 添加元素
    1. boolean add(E e),链表尾部添加一个元素
    2. void addFirst(E e),链表头部插入一个元素
    3. void add(int index, E element),指定位置插入一个元素
  • 删除元素
    1. boolean remove(Object o),移除指定的元素
    2. E remove(int index),移除指定位置的元素
    3. E remove()移除第一个元素
  • 获取元素
    1. E get(int index),E getFirst(),E getLast()
  • 遍历
    1. 迭代器、foreach语句、for循环
    2. foreach语句效率最高,其次是迭代器,效率最差的是for循环
//循环
for(int i=0;i<list.size;i++){
    list.get(i);
}

//迭代器
for(Iterator iter = list.iterator(); iter.hasNext();)
    iter.next();

//foreach
for(Integer integ:list)
    ;

运算符

  • <<:左移运算符,num << 1,相当于num乘以2

  • '>>:右移运算符,num >> 1,相当于num除以2

  • '>>>:无符号右移,忽略符号位,空位都以0补齐

List函数

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new ArrayList<>();
        if (intervals.length == 0 || intervals == null) return res.toArray(new int[0][]);
        // 对起点终点进行排序
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        int i = 0;
        while (i < intervals.length) {
            int left = intervals[i][0];
            int right = intervals[i][1];
            // 如果有重叠,循环判断哪个起点满足条件
            while (i < intervals.length - 1 && intervals[i + 1][0] <= right) {
                i++;
                right = Math.max(right, intervals[i][1]);
            }
            // 将现在的区间放进res里面
            res.add(new int[]{left, right});
            // 接着判断下一个区间
            i++;
        }
        return res.toArray(new int[0][]);
    }
}

new int[0][]的意思:

toArray()调用的时候一般要传一个数组指定类型,如果不传参数会默认返回Object数组,然后toArray内部会自动判断传入数组大小是否小于list中元素的个数,如果小于则会产生一个大小等于元素个数的新数组,写入数据后返回,否则写入传入的数组,然后返回。下面是ArrayList中实现的源码。

 public Object[] toArray() {
       return Arrays.copyOf(elementData, size);
 }

public <T> T[] toArray(T[] a) {
       if (a.length < size)
           // Make a new array of a's runtime type, but my contents:
           return (T[]) Arrays.copyOf(elementData, size, a.getClass());
       System.arraycopy(elementData, 0, a, 0, size);
       if (a.length > size)
           a[size] = null;
       return a;
   }

对于 Arrays.sort方法排序

        //也可以这样排序!!
        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
        //也可以这样排序
        Arrays.sort(intervals, (a,b) -> a[0]-b[0]);

关于Java的排序使用:blog.csdn.net/DeMonliuhui…

细节原理

        Arrays.sort(nodes, new Comparator<Node>() {
        	public int compare(Node node1, Node node2) {
        		if (node1.min == node2.min) {
        			if (node1.sum == node2.sum) 
        				return node1.index - node2.index;
        			else
        				return node2.sum - node1.sum;
        		}
        		else
        			return node2.min - node1.min;
        	}
        });