程序员成长之路(Day 27)


学习内容:

LintCode刷题:

·查询课程创建时间和教师国籍

        延伸->(SQL的inner join)

Select courses.created_at as course_date,
 teachers.country as teacher_country 
from courses inner join teachers on courses.teacher_id = teachers.id;

·两两交换链表中的节点

        把头拿进来当头或者下一个为空的时候直接返回这个头,注意这里得先写检验头是不是空,因为||是当左边条件为错误时直接跳过右边的,所以当head为空时,head.next是会有异常的,定义一个新头,把原来旧头的next赋值给它,并定义一个新的next,这个next是新链表(调换前两个顺序完)的第三个,这个next也是原第三第四个的旧头,所以把它放到方法里,返回新头连在第二个后面即可。

/**
 * Definition for ListNode
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

public class Solution {
    
    public ListNode swapPairs(ListNode head) {
        // if(head.next==null||head==null)     报异常
        if(head==null||head.next==null){
            return head;
        }
        ListNode newhead = head.next;
        ListNode next = swapPairs(newhead.next);
        newhead.next=head;
        head.next=next;
        return newhead;
    }
}

·区间最小数

        首先需要创建线段树的节点,然后创建线段树的构造方法,root的min用Integer.Max_VALUE,然后将这个数组不停的放入到这个线段树当中,root的min取左节点和右节点min的最小值(在start和end不相等的时候),在相等时直接等于A中的元素。创建一个查找方法,可以查找到左节点start,和右节点end的root的min值,先定义mid为root的中点,用mid的值在那个范围来进行查询方法的递归,最后利用类Interval拿到start和end值,来遍历传入的queries,用传入的数组A来创建根节点,调用查找方法即可。

import java.util.ArrayList;
import java.util.List;

class Interval {
    int start, end;

    Interval(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

class TreeNode {
    public int start, end, min;
    public TreeNode left, right;

    public TreeNode(int start, int end, int min) {
        this.end = end;
        this.start = start;
        this.min = min;
        this.left=this.right=null;
    }
}

public class Solution {
    public TreeNode build (int start,int end,int[]A){
        if (start>end){
            return null;
        }
        TreeNode root = new TreeNode(start,end,Integer.MAX_VALUE);
        if (start!=end){
            int mid =(start+end)/2;
            root.left =build(start,mid,A);
            root.right=build(mid+1,end,A);
            root.min =Math.min(root.left.min,root.right.min);
        }else{
            root.min =A[start];
        }
        return root;
    }
    public int query(TreeNode root,int start ,int end){
        if (start == root.start && root.end == end){
            return root.min;
        }
        int leftMin =Integer.MAX_VALUE;
        int rightMin =Integer.MAX_VALUE;
        int mid = (root.start+root.end)/2;
        if (start<=mid){
            if (mid<end){
                leftMin =query(root.left,start,mid);
            }else
                leftMin=query(root.left,start,end);
        }
        if (mid<end){
            if (mid>=start){
                rightMin =query(root.right,mid+1,end);}
            else{
                rightMin =query(root.right,start,end);
            }
        }
            return Math.min(leftMin,rightMin);
    }
    public List<Integer> intervalMinNumber(int[] A, List<Interval> queries) {
        TreeNode root = build(0,A.length-1,A);
        List<Integer> ans = new ArrayList<>();
        for (Interval interval:queries){
            ans.add(query(root,interval.start,interval.end));
        }
        return ans;
    }
}

 ·最大值在界内的子数组个数

        定义一个左指针,一个结果,一个拿来数组中符合条件的位置,用右指针++遍历数组,当这个数组中的元素在[L,R]中就可以把结果+=右指针-左指针+1,因为当元素连续的符合[L,R]这个集合,那么,他们满足子数组个数=1+2+3+4+...+n,并且把当前位置记下来,因为如果下个元素小于这个集合,那么它只能单独的加在上一个元素后面,子数组个数只能+1,当元素大于这个集合时,那么就需要重置windows,把左指针指向当前元素的后一个元素即可。

public class Solution {
    public int numSubarrayBoundedMax(int[] A, int L, int R) {
        int left = 0;
        int resultint = 0;
        int windows = 0;
        for(int right =0;right<A.length;right++){
            if (A[right]>=L&&A[right]<=R){
                resultint +=right-left+1;
                windows =right-left+1;
            }else if (A[right]<L)
                resultint+=windows;
            else {
                windows=0;
                left=right+1;
            }
        }
        return resultint;
    }
}

 ·车队

         根据TreeMap的定义会按照传入的Key值自动排序,按照距离终点的距离来实现排序,所以只要统计速度大于上一个速度时,就可以知道有几个车队。

public class Solution {

    public int carFleet(int target, int[] position, int[] speed) {
        // Write your code here
        TreeMap<Integer, Double> m = new TreeMap<>();
        for (int i = 0; i < position.length; ++i) {
            m.put(-position[i], (double)(target - position[i]) / speed[i]);
        }
        int res = 0; double cur = 0;
        for (double time : m.values()) {
            if (time > cur) {
                cur = time;
                res++;
            }
        }
        return res;
    }
}

 


学习时间:

2021-9-11 14:00-17:00、19:30-20:10



学习产出:

刷题*6

学习博客*1

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值