字节跳动(校招)算法原题
大模型"价格战"越演越烈
昨天的 文章 提到,自从 5 月 15 号,字节跳动发布了击穿行业底价的豆包大模型后,各大厂家纷纷跟进降价,而且都不是普通降价,要么降价 90% 以上,要么直接免费。
今天是豆包发布会过去的第 8 天,价格战还在继续,且越演越烈。
腾讯混元大模型宣布全面降价,其中主力模型之一的混元-lite更是从即日起免费使用。
科大讯飞也宣布讯飞星火 API 永久免费开放。
而在昨天(5 月 22 号)举办的 Baichuan 4 模型产品发布会上,百川智能创始人兼 CEO 王小川也点评了最近的"大模型价格战",其声称:"在中国市场,API 服务其实对创业公司是走不通的"。
...
回归主线。
来一道和「字节跳动(校招)」相关的算法原题。
题目描述
平台:LeetCode
题号:886
给定一组 n 人(编号为 1, 2, ..., n), 我们想把每个人分进任意大小的两组。
每个人都可能不喜欢其他人,那么他们不应该属于同一组。
给定整数 n 和数组 dislikes ,其中 ,表示不允许将编号为 和 的人归入同一组。
当可以用这种方法将所有人分进两组时,返回 true;否则返回 false。
示例 1:
输入:n = 4, dislikes = [[1,2],[1,3],[2,4]]
输出:true
解释:group1 [1,4], group2 [2,3]
示例 2:
输入:n = 3, dislikes = [[1,2],[1,3],[2,3]]
输出:false
示例 3:
输入:n = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]
输出:false
提示:
-
-
-
-
-
-
dislikes中每一组都 不同
染色法
无论是从题目描述和对点边的描述,这都是一道「染色法判定二分图」的模板题。
为了方便,我们令 dislikes 为 ds,将其长度记为 。
题目要求我们将 个点划分到两个集合中,同时我们将每个 看做无向边的话,可知集合内部无边,即所有的边必然横跨两个集合之间。
使用 进行建图,并将两个将要划分出的两个集合分别记为 A 和 B,我们可以采用「染色」的方式,尝试将所有点进行划分。
构建一个与点数相等的数组 color,我们人为规定划分到集合 A 的点满足 ,划分到集合 B 的点满足 ,起始有 ,代表该点尚未被划分。
随后我们可以实现 DFS 函数为 boolean dfs(int u, int cur) 含义为尝试将点 u 上 cur 色。根据定义可知,我们除了需要 color[u] = cur 以外,还需要遍历点 u 的所有出边(处理其邻点,将其划分到另一集合上),若在处理过程中发生冲突,则返回 false,若能顺利染色则返回 true。
由于我们固定了颜色编号为 1 和 2,因此 cur 的对立色可统一为 3 - cur。
最终,我们根据能否给所有点染色成功来决定答案。
Java 代码:
class Solution {
int N = 2010, M = 2 * 10010;
int[] he = new int[N], e = new int[M], ne = new int[M], color = new int[N];
int idx;
void add(int a, int b) {
e[idx] = b;
ne[idx] = he[a];
he[a] = idx++;
}
boolean dfs(int u, int cur) {
color[u] = cur;
for (int i = he[u]; i != -1; i = ne[i]) {
int j = e[i];
if (color[j] == cur) return false;
if (color[j] == 0 && !dfs(j, 3 - cur)) return false;
}
return true;
}
public boolean possibleBipartition(int n, int[][] ds) {
Arrays.fill(he, -1);
for (int[] info : ds) {
int a = info[0], b = info[1];
add(a, b); add(b, a);
}
for (int i = 1; i <= n; i++) {
if (color[i] != 0) continue;
if (!dfs(i, 1)) return false;
}
return true;
}
}
C++ 代码:
class Solution {
public:
int he[2010], e[2 * 10010], ne[2 * 10010], color[2010], idx = 0;
void add(int a, int b) {
e[idx] = b;
ne[idx] = he[a];
he[a] = idx++;
}
bool dfs(int u, int cur) {
color[u] = cur;
for (int i = he[u]; i != -1; i = ne[i]) {
int j = e[i];
if (color[j] == cur) return false;
if (color[j] == 0 && !dfs(j, 3 - cur)) return false;
}
return true;
}
bool possibleBipartition(int n, vector<vector<int>>& ds) {
fill(he, he + n + 10, -1);
for (const auto& info : ds) {
int a = info[0], b = info[1];
add(a, b); add(b, a);
}
for (int i = 1; i <= n; i++) {
if (color[i] != 0) continue;
if (!dfs(i, 1)) return false;
}
return true;
}
};
Python 代码:
class Solution:
def possibleBipartition(self, n: int, ds: List[List[int]]) -> bool:
N, M = 2010, 20010
he, e, ne, color = [-1] * N, [0] * M, [0] * M, [0] * N
idx = 0
def add(a, b):
nonlocal idx
e[idx], ne[idx], he[a] = b, he[a], idx
idx += 1
def dfs(u, cur):
color[u] = cur
i = he[u]
while i != -1:
j = e[i]
if color[j] == cur:
return False
if color[j] == 0 and not dfs(j, 3 - cur):
return False
i = ne[i]
return True
for info in ds:
a, b = info[0], info[1]
add(a, b)
add(b, a)
for i in range(1, n + 1):
if color[i] != 0:
continue
if not dfs(i, 1):
return False
return True
TypeScript 代码:
function possibleBipartition(n: number, ds: number[][]): boolean {
const N = 2010, M = 2 * 10010
const he = new Array<number>(N).fill(-1), e = new Array<number>(M).fill(0), ne = new Array<number>(M).fill(0), color = new Array<number>(N).fill(0)
let idx = 0
function add(a: number, b: number): void {
e[idx] = b
ne[idx] = he[a]
he[a] = idx++
}
function dfs(u: number, cur: number): boolean {
color[u] = cur
for (let i = he[u]; i != -1; i = ne[i]) {
const j = e[i];
if (color[j] == cur) return false
if (color[j] == 0 && !dfs(j, 3 - cur)) return false
}
return true
}
for (const info of ds) {
const a = info[0], b = info[1]
add(a, b); add(b, a)
}
for (let i = 1; i <= n; i++) {
if (color[i] != 0) continue
if (!dfs(i, 1)) return false
}
return true
}
-
时间复杂度: -
空间复杂度:
反向点 + 并查集
我们知道对于 而言,点 a 和点 b 必然位于不同的集合中,同时由于只有两个候选集合,因此这样的关系具有推断性:即对于 和 可知 a 和 c 位于同一集合。
因此,我们可以对于每个点 x 而言,建议一个反向点 x + n:若点 x 位于集合 A 则其反向点 x + n 位于集合 B,反之同理。
基于此,我们可以使用「并查集」维护所有点的连通性:边维护变检查每个 的联通关系,若 联通,必然是其反向点联通所导致,必然是此前的其他 导致的关系冲突,必然不能顺利划分成两个集合,返回 false,否则返回 true。
Java 代码:
class Solution {
int[] p = new int[4010];
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void union(int a, int b) {
p[find(a)] = p[find(b)];
}
boolean query(int a, int b) {
return find(a) == find(b);
}
public boolean possibleBipartition(int n, int[][] ds) {
for (int i = 1; i <= 2 * n; i++) p[i] = i;
for (int[] info : ds) {
int a = info[0], b = info[1];
if (query(a, b)) return false;
union(a, b + n); union(b, a + n);
}
return true;
}
}
C++ 代码:
class Solution {
public:
vector<int> p;
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void unionp(int a, int b) {
p[find(a)] = p[find(b)];
}
bool query(int a, int b) {
return find(a) == find(b);
}
bool possibleBipartition(int n, vector<vector<int>>& ds) {
p.resize(2 * n + 1);
for (int i = 1; i <= 2 * n; ++i) p[i] = i;
for (const auto& info : ds) {
int a = info[0], b = info[1];
if (query(a, b)) return false;
unionp(a, b + n);
unionp(b, a + n);
}
return true;
}
};
Python 代码:
class Solution:
def possibleBipartition(self, n: int, ds: List[List[int]]) -> bool:
p = [i for i in range(0, 2 * n + 10)]
def find(x):
if p[x] != x:
p[x] = find(p[x])
return p[x]
def union(a, b):
p[find(a)] = p[find(b)]
def query(a, b):
return find(a) == find(b)
for info in ds:
a, b = info[0], info[1]
if query(a, b):
return False
else:
union(a, b + n)
union(b, a + n)
return True
TypeScript 代码:
function possibleBipartition(n: number, ds: number[][]): boolean {
const p = new Array<number>(4010).fill(0)
function find(x: number): number {
if (p[x] != x) p[x] = find(p[x])
return p[x]
}
function union(a: number, b: number): void {
p[find(a)] = p[find(b)]
}
function query(a: number, b: number): boolean {
return find(a) == find(b)
}
for (let i = 1; i <= 2 * n; i++) p[i] = i
for (const info of ds) {
const a = info[0], b = info[1]
if (query(a, b)) return false
union(a, b + n); union(b, a + n)
}
return true
}
-
时间复杂度: -
空间复杂度:
最后
给大伙通知一下 📢 :
全网最低价 LeetCode 会员目前仍可用 ~
📅 年度会员:有效期加赠两个月!!; 季度会员:有效期加赠两周!!
🧧 年度会员:获 66.66 现金红包!!; 季度会员:获 22.22 现金红包!!
🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!
专属链接:leetcode.cn/premium/?promoChannel=acoier
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉
相关文章:
字节跳动(校招)算法原题
大模型"价格战"越演越烈 昨天的 文章 提到,自从 5 月 15 号,字节跳动发布了击穿行业底价的豆包大模型后,各大厂家纷纷跟进降价,而且都不是普通降价,要么降价 90% 以上,要么直接免费。 今天是豆包…...
前端面试题日常练-day39 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末。 1. 哪个jQuery方法用于设置元素的HTML内容? a) .html() b) .text() c) .val() d) .append() 2. 在jQuery中,以下哪个方法用于隐藏或显示一个元素? a) .toggle…...
心电信号降噪方法(滤波器/移动平均/小波等,MATLAB环境)
对于一个正常的、完整的心动周期,对应的心电图波形如下图所示,各个波形都对应着心脏兴奋活动的生理过程,包含P波,PR段,QRS波群,ST段,T波,U波。 (1)P波心电图中…...
Kubernetes 文档 / 概念 / 工作负载 / 管理工作负载
Kubernetes 文档 / 概念 / 工作负载 / 管理工作负载 此文档从 Kubernetes 官网摘录 中文地址 英文地址 你已经部署了你的应用并且通过 Service 将其暴露出来。现在要做什么? Kubernetes 提供了一系列的工具帮助你管理应用的部署,包括扩缩和更新。 组织…...
【第6章】SpringBoot整合Mybatis
文章目录 前言一、准备1. 版本要求2.安装3. 建表语句 二、案例1. mapper2.实体类3.测试类4.扫描5. 配置6. mapper.xml7.输出 总结 前言 MyBatis-Spring-Boot-Starter 可以帮助你更快地在 Spring Boot 之上构建 MyBatis 应用。 一、准备 1. 版本要求 MyBatis-Spring-Boot-Sta…...
vim常用指令——001
vim常用指令 Vim的命令模式常用操作一、定位移动光标二、行的基本操作【复制、粘贴、删除】三、查找、替换四、分屏命令 总结给大家总结下四个运行模式: Vim的命令模式常用操作 一、定位移动光标 按h:将光标向左移动一个字符,等同于方向键左…...
java 对接农行支付相关业务(二)
文章目录 农行掌银集成第三方APP1:掌银支付对接快e通的流程1.1 在农行网站上注册我们的app信息([网址](https://openbank.abchina.com/Portal/index/index.html))1.2:java整合农行的jar包依赖1.3:把相关配置信息整合到项目中1.4:前端获取授权码信息1.5:后端根据授权码信…...
超频是什么意思?超频的好处和坏处
你是否曾经听说过超频?在电脑爱好者的圈子里,这个词似乎非常熟悉,但对很多普通用户来说,它可能还是一个神秘而陌生的存在。 电脑超频是什么意思 电脑超频(Overclocking),顾名思义,是…...
【cocos creator】进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示
进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示 const { ccclass, property, menu } cc._decorator;let text_type cc.Enum({"20%": 0,"1/5": 1,"差值": 2,"自定义…...
Bean的一些属性信息总结
我们知道,在Spring中,一个Bean可以理解为一个对象,但是二者之间肯定是有区别的,比如一个Bean可以实例化成很多个对象、Bean中可以带有某些描述信息。 学习Bean,能更好地使用Bean。 1、Spring两个核心概念的由来【可忽…...
CentOS 7 安装 Minio
获取MinIO安装包 下载地址如下:下载地址通过以下命令可直接将安装包下载至服务器 wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm安装MinIO rpm -ivh minio-20230809233022.0.0.x86_64.rpm集成Systemd …...
vue3和vite实现vue-router4版本路由的配置以及自动生成路由配置
这个是普通的手动路由配置:https://blog.csdn.net/weixin_68658847/article/details/130071101 自动路由配置 创建项目 npm create vitelatest my-vue-app -- --template vue // 或者 yarn create vite my-vue-app --template vue// 安装路由 yarn add vue-route…...
Flutter 中的 CupertinoDatePicker 小部件:全面指南
Flutter 中的 CupertinoDatePicker 小部件:全面指南 在 Flutter 中,CupertinoDatePicker 是 Cupertino 组件库的一部分,它提供了一个 iOS 风格的日期选择器。这个选择器允许用户选择日期和时间,非常适合需要符合 iOS 设计指南的应…...
用 Python 编写自动发送每日电子邮件报告的脚本
第一步:安装必要的库 你需要安装 smtplib(Python 自带),但你需要安装 schedule 和 email 库。你可以使用以下命令安装这些库: pip install schedule第二步:编写发送邮件的脚本 这里是一个完整的 Python …...
IT人的拖延——渴望成功与害怕成功的矛盾
很多人都以为,害怕失败是拖延的主要诱因,但其实“害怕成功”也是拖延的主要诱因之一。要说这个原因,我们不得不提起Bible中的一个人“约拿”,让我们先来看看他的故事带给我们什么启示。 约拿情结简介 约拿是Bible中的一名先知&a…...
【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)
一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序,提供运动场馆运营解决方案,适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码:打造高效便捷的预定体验 一、引言:数字化预定时代的来临 …...
音乐系统java在线音乐网站基于springboot+vue的音乐系统带万字文档
文章目录 音乐系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考(9.9¥带走) 音乐系统 一、项目演示 在线音乐系统 二、项目介绍 基于springbootvue的前后端分离在线音乐系…...
Python—面向对象小解(1)
一、面向对象 面向对象编程(Object-Oriented Programming,简称 OOP)是一种程序设计范式,它通过使用“对象”和“类”来组织代码。Python 是一种面向对象的编程语言,支持 OOP 的核心概念。 面向过程:…...
2024最新TikTok抖音国际版,tiktok正版免拔卡安装来了!
保姆级教程!2024最新TikTok抖音国际版,无限制!tiktok正版免拔卡安装方法来了! TikTok这款APP为何让全球都为之疯狂?因为它更懂人性,懂的人都懂! 我是你的老朋友阿星,今天阿星要给大…...
【Python-OS】os.path.splitext()
作用:将文件路径分割成文件名和扩展名两部分。 slide_id, _ os.path.splitext(slide) print("slide:") print(slide) print("slide_id:") print(slide_id)注: slide是文件名,可以自行赋值...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
