7.20学习总结

8:30——9:00单词time!

9:00——11:30JAVA学习

14:30——18:00第二周vj题

19:00——21:00第二周vj题

JAVA学习

多线程中的lock锁

Lock接口的基本特性

1、尝试非阻塞地获取锁

2、能被中断地获取锁

3、超时获取锁

解释:1:即当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁

意思就相当于推门,看门有没有被别人锁上。

2:获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放

3:在指定时间前获取锁,如果此时门已锁上,则直接返回

Lock常见方法

void lock()    获得锁。如果锁不可用,则当前线程将被禁用以进行线程调度,并处于休眠状态,直到获取锁。
void lockInterruptibly()    获取锁,如果可用并立即返回。如果锁不可用,那么当前线程将被禁用以进行线程调度,并且处于休眠状态,和lock()方法不同的是在锁的获取中可以中断当前线程(相应中断。
Condition newCondition()    获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait()方法,而调用后,当前线程将释放锁。
boolean tryLock()    只有在调用时才可以获得锁。如果可用,则获取锁定,并立即返回值为true;如果锁不可用,则此方法将立即返回值为false 。
boolean tryLock(long time, TimeUnit unit)    超时获取锁,当前线程在一下三种情况下会返回: 1. 当前线程在超时时间内获得了锁;2.当前线程在超时时间内被中断;3.超时时间结束,返回false.
void unlock()    释放锁。

使用Lock同步的格式

Lock lock = ...;
lock.lock();
try{
    //处理任务
}catch(Exception ex){
     
}finally{
    lock.unlock();   //释放锁
}

刷题

M题

这道题很简单可以直接用暴力解法直接求解

以下为部分代码

 for(int i=0;a*i<=n;i++)
    {
        for(int j=0;a*i+b*j<=n;j++)
        {
            if((n-a*i-b*j)%c==0)
                ans=max(ans,(n-a*i-b*j)/c+i+j);
        }
    }

a,b,c为输入的三个值

F题

这题我看了很久。。。。。始终不理解怎么优化算法时间到nlgn。。。看了很多题解也没找到能看懂的最后问了大佬才搞明白。。先贴代码

 for(int i=2; i<=n; i++)
    {
        if(a[i] > dp[max1])
        {
            dp[++max1] = a[i];
        }
        else
        {
            int low = 1,high = max1;
            while(low <= high)
            {
                int mid = (low + high) / 2;
                if(a[i] >= dp[mid])
                    low = mid + 1;
                else high = mid - 1;
            }
            t=low;
            dp[t] = a[i];
        }
    }

其中max1为所求答案,dp数组用来存放每个数字从开头到本身最长的子数列,先用第一个if判断是否可以直接插入到最长子数列中,可以就直接将自己存放进去,否则用二分法判断下一个数,如果直接用for()循环会导致时间复杂度O(n*n)超限,最后则用dp存放当前数。

无了。。。今天花在这种怎么也看不明白的题上面太多时间了。。。。。。后面的题看了半天,,,可能受这题影响都没什么思路。。。。以后实在不会的建议上网搜题解,,,实在不会就跳过吧,,,哎~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值