res

Leetcode题解 - 中等难度(1311、LCP 3、1306、1282、1296、1297)

倾然丶 夕夏残阳落幕 提交于 2020-02-26 10:29:47
1311. 获取你好友已观看的视频 - BFS 思路: 找到第level层的好友,是一层一层寻找所以使用BFS,然后再计数就行了 """ BFS """ from collections import defaultdict, Counter class Solution: def watchedVideosByFriends(self, watchedVideos, friends, id: int, level: int): mat = defaultdict(list) # 先建图 for ind, num in enumerate(friends): mat[ind] += num Q, vis = [(id, 0)], {id} # BFS找level层的朋友是谁 while len(Q) != 0: node, deepth = Q.pop(0) if deepth == level: Q = [i[0] for i in Q] + [node] break for i in mat[node]: if i not in vis: vis.add(i) Q.append((i, deepth+1)) res = [] for i in Q: res += watchedVideos[i] r = sorted(Counter(res).items(), key

F. Tree with Maximum Cost(换根)

懵懂的女人 提交于 2020-02-22 16:13:13
F. Tree with Maximum Cost 学习博客: https://blog.csdn.net/LJD201724114126/article/details/85240762?utm_source=app 题解: 换根 我们先设sum[u] 等于 以u为根的子树的∑a i (注意没有*距离),再计算以1为根的贡献值res。 这时我们要从父亲节点u向儿子节点v换根,故需要将res的值转化为以v为根的value 首先我们要先 res -= sum[v] ,因为换根之前,以v为根的子树(包括v)到原根u的深度比换根之后,到新根v的深度少了一,故减去 然后我们 sum[u] -= sum[v] ,因为原来sum[u]表示的是以u为根的值(包括了以v为根),而这时是以v为根的,故sum[u]要减去sum[v], res += sum[u] ,因为换根之前,以u为根的子树(包括u)到原根u的深度比换根之后,到新根v的深度多了一,故加上 最后 sum[v]+=sum[u] ,因为v要成为整个树的根,而原来sum[v]不包括以u为根的节点值,故要加上。 换完之后我们再换回来。 这里巧妙的应用了换根,就是先求出任意一个根的结果,然后我们dfs,将相邻的根换一换,求出结果。 AC_Code 1 #include <bits/stdc++.h> 2 using namespace std;

MOOC(7)- case依赖、读取json配置文件进行多个接口请求-封装接口请求(2)

末鹿安然 提交于 2020-02-15 19:18:08
与1的区别在于加入了构造函数 # 封装接口请求 import requests import json class RunMain: def __init__(self, url, method, data=None): self.res = self.run_main(url, method, data) def send_get(self, url, para): res = requests.get(url, para) return res.json() def send_post(self, url, data): res = requests.post(url, data) r = res.json() return json.dumps(r, indent=2, sort_keys=True, ensure_ascii=False) def run_main(self, url, method, data=None): res = None if method.upper() == "GET": res = self.send_get(url, data) elif method.upper() == "POST": res = self.send_post(url, data) else: print("请输入正确的参数") return res if __name

leetcode 7 整数反转

跟風遠走 提交于 2020-02-14 01:02:10
1.题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/reverse-integer 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 2.我的题解 2.1 long long 防止越界 注意越界! class Solution { public : int reverse ( int x ) { long long res = 0 ; int sign = x > 0 ? 1 : - 1 ; long long xx = sign * ( long ) x ; while ( xx ) { res = res * 10 + xx % 10 ; xx / = 10 ; } res * = sign ; if ( res > INT_MAX || res < INT_MIN ) return 0 ; return res ; } } ; 3

python机器学习-chapter2_11

為{幸葍}努か 提交于 2020-02-11 15:46:37
•hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。 import numpy as np arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) res = np.hstack((arr1, arr2)) print res >>>[1 2 3 4 5 6] arr1 = np.array([[1, 2],      [3, 4], [5, 6]]) arr2 = np.array([[7, 8], [9, 0], [0, 1]]) res = np.hstack((arr1, arr2)) print res >>> [[1 2 7 8] [3 4 9 0] [5 6 0 1]]                来源: https://www.cnblogs.com/bozi/p/12295079.html

python正则

放肆的年华 提交于 2020-02-09 08:27:39
import re # 元字符 . ^ $ * + ? {} [] () | \ # findall() # 简单匹配 # res = re.findall("abc", "abcabcabcaaaddd") # 模糊匹配 # res = re.findall("a.c", "abcadcaabc") # .表示一位占位符 # res = re.findall("^abc", "abcabc") # 从头开始匹配 # res = re.findall("abc$", "abcabcaaabc") # 从尾开始匹配 # res = re.findall("abc*", "ab") # 表示匹配[0,+00) # res = re.findall("abc+", "abccc") # 表示匹配[1,+00) # res = re.findall("abc{2}", "abccc") # 指定次数匹配 # res = re.findall("abc{1,3}", "abccccc") # res = re.findall("abc?", "abcc") # 表示匹配[0,1] # res = re.findall("abc|adc", "abcadc") # 表示俩边或者 # res = re.findall("ab[cde]", "abcabdabe") # 或者其中之一 # res

[leetcode]241. 为运算表达式设计优先级

故事扮演 提交于 2020-02-07 07:47:15
1、提交的代码,分治 class Solution { map < pair < int , int > , vector < int > > hash ; // 备忘录 key: <left,right> public : vector < int > ways ( const string & input , int left , int right ) { pair < int , int > curKey ( left , right ) ; if ( hash . find ( curKey ) != hash . end ( ) ) { //之前存了 return hash [ curKey ] ; } vector < int > res ; for ( int i = left ; i < right ; i ++ ) { if ( input [ i ] == '-' || input [ i ] == '+' || input [ i ] == '*' ) { //遇到操作符分别递归计算左边、右边, //当前选择的操作符优先最低(递归的下一层的表达式先算) vector < int > left_result = ways ( input , left , i ) ; vector < int > right_result = ways ( input , i

杨辉三角形II

余生长醉 提交于 2020-02-07 06:04:29
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。 在杨辉三角中,每个数是它左上方和右上方的数的和。 示例: 输入: 3 输出: [1,3,3,1] 进阶: 你可以优化你的算法到 O(k) 空间复杂度吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/pascals-triangle-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 class Solution { public : vector < int > getRow ( int rowIndex ) { //这道题是在杨辉三角形上的晋级; //先按照杨辉三角形的方法接一下; vector < vector < int >> res ( rowIndex + 1 ) ; if ( rowIndex == 0 ) { return { 1 } ; } res [ 0 ] . push_back ( 1 ) ; for ( int i = 1 ; i < rowIndex + 1 ; i ++ ) { res [ i ] . push_back ( 1 ) ; for ( int j = 1 ; j < i ; j ++ ) { res [ i ] . push_back ( res [ i - 1 ] [ j - 1 ] +

29.两数相除

可紊 提交于 2020-02-07 05:31:15
感觉比较麻烦,想着想着就容易思绪打结,容易懵。。 这道题是要求两个数相除的结果是什么,但是不能用乘法,除法,mod 那我们思考一下结果的含义是什么,声明一个变量res来代表结果,res就是被除数里包含的除数的个数。这里假设被除数num1,除数为num2。 假设num1=20,num2=3。1个num2=3, 2个num2=6, 4个num3=12, 8个num3=24,我们可以知道4<res<8, 最初的时候res为1,每次num2左移一位,res也跟着左移一位,因为num2变为原来的两倍,那么个数也要是原来的两倍才能达成。直到num2*2 > num1,说明此时的num2已经比num1的一半要大了,就不能在翻倍的扩大。这个时候num1减去res个num2剩下的值再拿来和最初的num2做递归,得到的个数加上res就是结果。这道题确实不是很好理解,说也有点说不清楚的感觉。。。 递归部分的代码如下: 然后这道题还有考虑边界的问题,是否达到了最大值或者最下值,这个也有点麻烦,代码如下: 来源: CSDN 作者: qq_40058686 链接: https://blog.csdn.net/qq_40058686/article/details/104201399

leetcode 152. 乘积最大子序列

☆樱花仙子☆ 提交于 2020-02-05 03:49:16
解题思路: 动态规划 使用滚动数组,减少数组的开辟的空间 dp[i][0]: 数组下表从0到i 使用nums[i]的乘积最大的值 dp[i][1]: 数组下表从0到i 使用nums[i]的乘积最小的值 为什么使用最大值和最小值? 答: 因为当前元素可能为正也可能为负,如果为正,使用最大值,如果为负,使用最小值。 int x=i%2; int y=(i-1)%2; arr[x][0]=Math.max(Math.max(arr[y][0]*nums[i],arr[y][1]*nums[i]),nums[i]); arr[x][1]=Math.min(Math.min(arr[y][0]*nums[i],arr[y][1]*nums[i]),nums[i]); 代码: public static void main(String[] args) { int[] nums={2,3,-2,4}; int ans = maxProduct2(nums); System.out.println(ans); } public static int maxProduct(int[] nums) { int[][] arr=new int[nums.length][2]; arr[0][0]=nums[0]; arr[0][1]=nums[0]; int res=nums[0]; for(int