首页 > 编程语言 >算法杂记 2023/04/02

算法杂记 2023/04/02

时间:2023-04-02 23:46:31浏览次数:66  
标签:02 index arr cur 04 int 2023 Subarray its

算法杂记 2023/04/02

目录

网易笔试第二题

给定一棵中序遍历的二叉树,如果当前树为空则表示为X,如果不为空则表示为(left_tree)cur_value(right_tree),其中left_tree和right_tree分别表示按此规则序列化之后的左右子树字符串。找出重复子树的数量,相同子树只计算一次。

输入:

字符编码的二叉树

输出:

重复子树的个数

例子:

输入:
((X)2(X))1(((X)4(X))3((X)2(X)))
输出:
1

解释:只有相同节点2

这题如果不考虑反序列化的操作,实际上就是力扣的一道原题 LC625,寻找重复的子树,我们对子树进行序列化后用哈希表存储就行了。

考虑如何进行反序列化操作。流程,设当前索引是 index

  • 如果碰到 X ,说明是 NULL 节点,直接 return
  • 碰到 ( 说明存在左子树,进入下一层递归,最后返回得到的左子树和新索引。
  • 从当前索引开始,直到第一次碰到 ( ,该区间表示节点值 int(s[index->end])
  • 碰到 ( 说明存在右子树,进入下一层递归,最后返回得到的右子树和新索引。

最后代码:

def deserialize(s):
    def helper(index):
        # print("index", index)
        if s[index] == 'X':
            return None, index + 1

        if s[index] == '(':
            left, index = helper(index + 1)
        else:
            left = None
            index = index + 1
        index += 1
        
        i = index
        while s[i] != '(':
            i += 1
        num = int(s[index:i])
        index = i
        

        if s[index] == '(':
            right, index = helper(index + 1)
        else:
            right = None
            index = index + 1
        # print("finish index", index)
        return TreeNode(num, left, right), index + 1

    root, _ = helper(0)
    return root

6329. Make K-Subarray Sums Equal

You are given a 0-indexed integer array arr and an integer k. The array arr is circular. In other words, the first element of the array is the next element of the last element, and the last element of the array is the previous element of the first element.

You can do the following operation any number of times:

  • Pick any element from arr and increase or decrease it by 1.

Return the minimum number of operations such that the sum of each subarray of length k is equal.

A subarray is a contiguous part of the array.

Example 1:

Input: arr = [1,4,1,3], k = 2
Output: 1
Explanation: we can do one operation on index 1 to make its value equal to 3.
The array after the operation is [1,3,1,3]
- Subarray starts at index 0 is [1, 3], and its sum is 4 
- Subarray starts at index 1 is [3, 1], and its sum is 4 
- Subarray starts at index 2 is [1, 3], and its sum is 4 
- Subarray starts at index 3 is [3, 1], and its sum is 4 

Example 2:

Input: arr = [2,5,5,7], k = 3
Output: 5
Explanation: we can do three operations on index 0 to make its value equal to 5 and two operations on index 3 to make its value equal to 5.
The array after the operations is [5,5,5,5]
- Subarray starts at index 0 is [5, 5, 5], and its sum is 15
- Subarray starts at index 1 is [5, 5, 5], and its sum is 15
- Subarray starts at index 2 is [5, 5, 5], and its sum is 15
- Subarray starts at index 3 is [5, 5, 5], and its sum is 15 

Constraints:

  • 1 <= k <= arr.length <= 105
  • 1 <= arr[i] <= 109

不使用裴蜀定理,arr[i...i+k-1] = arr[i+1...i+k] 实际上等价于 arr[i] = arr[i+k] 我们可以相对于循环查找。

class Solution {
public:
    long long makeSubKSumEqual(vector<int>& arr, int k) {
        int n = arr.size();
        long long ans = 0;
        vector<int> vis(n, 0);
        for (int i = 0; i < n; ++ i){
            if (vis[i]) continue;
            vector<int> cur;
            for (int j = i; !vis[j]; j = (j + k) % n){
                vis[j] = 1;
                cur.push_back(arr[j]);
            }
            int m = cur.size();
            sort(cur.begin(), cur.end());
            for (auto x: cur) ans += abs(x  - cur[m / 2]);
        }
        return ans;
    }
};

否则,我们得使用裴蜀定理,定理是:ax + by = gcd(a, b) ,我们可以进行如下推导:

\[arr[i] = arr[i+nx+ky] = arr[i+\mathrm{gcd}(n, k)] \]

这样,我们就直接转化成在一维数组上进行一遍遍历得到结果(感觉在时间复杂度方面没区别)。

class Solution {
public:
    int gcd(int x, int y){
        if (y == 0) return x;
        return gcd(y, x % y);
    }

    long long makeSubKSumEqual(vector<int>& arr, int k) {
        int n = arr.size();
        int d = gcd(n, k);
        long long ans = 0;
        for (int i = 0; i < d; ++ i){
            vector<int> cur;
            for (int j = i; j < n; j += d) cur.push_back(arr[j]);
            sort(cur.begin(), cur.end());
            int _m = cur.size();
            for (auto x: cur) ans += abs(x - cur[_m / 2]);
        }
        return ans;
    }
};

标签:02,index,arr,cur,04,int,2023,Subarray,its
From: https://www.cnblogs.com/Last--Whisper/p/17281799.html

相关文章

  • 02-xss固定会话攻击
    xss学习可以步骤参考:https://www.cnblogs.com/tangtou/p/17281696.html目录原理xss平台cookie窃取和欺骗影响固定会话攻击防御原理用户会话令牌利用cookie来实现,cookie是存储在浏览器端的一小段文本,相当于身份证,会有窃取和欺骗的风险可以利用xss攻击窃取浏览器里的cookie信息......
  • Ubuntu 17.04 将取消 Swap 分区?
    Canonical的软件工程师DimitriJohnLedkov最近宣布即将发布的Ubuntu Linux 系统安装时将丢弃Swap分区方式,改为交换文件方式。对我们中的大多数使用带SSD或NVMe闪盘及内存充足的人来说,这不是什么大新闻。不过那些想要将Ubuntu后续版本安装在10多年前PC......
  • 2023-04-02 桥和割点以及图的遍历树
    桥和割点以及图的遍历树1什么是桥定义对于无向图,如果删除了一条边,整个图联通分量数量就会变化,则这条边称为桥(Bridge)。桥意味着图中最脆弱的关系应用交通系统比如两个城市上海和南京仅通过长江大桥相连,如果长江大桥被毁坏了,那么两个城市就分开各自为战了社交网络......
  • day33(2023.4.2)
    1.UDP传递基本数据类型(创建服务端)2.UDP传递基本数据类型(创建客户端) 运行结果: 3.UDP传递自定义对象类型   运行结果: 4.反射小概念 5.创建一个Users类  通过getClass()方法  运行结果: 6.通过.class静态属性获取Class对象和通过Class类中......
  • Ubuntu 17.04 将取消 Swap 分区?
    Canonical的软件工程师DimitriJohnLedkov最近宣布即将发布的Ubuntu Linux 系统安装时将丢弃Swap分区方式,改为交换文件方式。对我们中的大多数使用带SSD或NVMe闪盘及内存充足的人来说,这不是什么大新闻。不过那些想要将Ubuntu后续版本安装在10多年前PC......
  • 2023.4.2
    #include<stdio.h>#include<string.h>////intAdd(intx,inty)//{// intz=0;// z=x+y;// returnz;//}//intmain()//{// inta=20;// intb=5;// intsum=Add(a,b);// printf("%d\n",sum);// return0;//}//intmai......
  • 2023年4月2日
    执行英语单词,list5和list6数据结构,线性表的顺序表示15点03分  修改中期报告,15点19分  修改完成,改的不多,但我感觉不妙,像你这种做出页面的,抓紧学习了解系统,了解开发原理,免得被提问的不会18点10分  又傻子一样的去搞vscode,编程是真拉,删除元素那个死活写不对,for循环不是......
  • PAT甲级真题1020.树的遍历
    翻译和代码思路:Acwing一个二叉树,树中每个节点的权值互不相同。现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。输入格式第一行包含整数N,表示二叉树的节点数。第二行包含N个整数,表示二叉树的后序遍历。第三行包含N个整数,表示二叉树的中序遍历。输出格式输出一......
  • 省选联考2023 陪同参赛记
    Day0得知自己被要求场外参赛即单独扔一个机房里vp,心态是炸的,放学后被拉去试机,发现省选联考整个电脑用的都是Linux系统没有Dev差评,啥编译器都不会用,应xrz推荐用了下codeblocks,结果不会转cpp文件,简单敲了个线段树就走人了。Day18点10分到了考场,和xrz被扔到一个机房里,在同机房......
  • [2022年蓝桥杯C/C++ A组]个人做题记录
    碎碎念欸嘿,鸽了小半年去做了一些不喜欢的事情,但兜兜转转,还是acm最香捏求和题意求\(\sum_{i=1}^n\sum_{j=1}^na_i*a_j(i!=j)\)题解感觉是去年的时候笨人唯一做满分的题……经典前缀和,设\(sum[i]=\sum_{j=i}^na[j]\),答案即为\(\sum_{i=1}^{n-1}a[i]*sum[i+1]\)#definein......