题目链接
题目描述
这是一个函数实现题。你需要实现一个 crossTimes
(英文名直译为"叉时间",但实际应为叉积 cross product) 函数,该函数接收两个三维向量作为参数。
你的任务是计算这两个向量的叉乘(或称向量积),并返回结果向量。
输入:
vector1
: 一个包含三个整数的数组/列表,表示第一个向量。
vector2
: 一个包含三个整数的数组/列表,表示第二个向量。
输出:
- 一个包含三个整数的新数组/列表,表示结果向量
。
示例:
- 输入:
[1, 0, 1]
,[0, 1, 0]
- 你的函数应返回:
[-1, 0, 1]
解题思路
本题旨在考察对三维向量叉积定义的理解和实现。与点积返回一个标量不同,两个向量的叉积返回的是一个新的向量,该向量同时垂直于原来的两个向量。
对于两个三维向量 和
,它们的叉积
由以下公式定义:
[ c_x = y_1z_2 - z_1y_2 ]
[ c_y = z_1x_2 - x_1z_2 ]
[ c_z = x_1y_2 - y_1x_2 ]
实现步骤非常直接:
- 为了方便,我们将
vector1
的分量表示为x1, y1, z1
,vector2
的分量表示为x2, y2, z2
。x1 = vector1[0]
,y1 = vector1[1]
,z1 = vector1[2]
x2 = vector2[0]
,y2 = vector2[1]
,z2 = vector2[2]
- 根据上述公式,分别计算出结果向量的三个分量
cx
,cy
,cz
。 - 创建一个新的包含
cx, cy, cz
的数组/列表并返回。
数据范围考虑: 题目备注中提到坐标绝对值小于 1000。
- 单个乘积
y1*z2
的最大绝对值约为1000 * 1000 = 1,000,000
。 - 单个分量
cx
的最大绝对值约为1000*1000 - (-1000*1000) = 2,000,000
。 这个结果在标准的 32 位整型 (int
) 范围内,因此不需要使用long long
。
代码
注意:以下是你需要提交的全部内容,即在牛客网给定的模板中填写的代码。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算出这两个向量叉乘的结果
* @param vector1 int整型vector
* @param vector2 int整型vector
* @return int整型vector
*/
std::vector<int> crossTimes(std::vector<int>& vector1, std::vector<int>& vector2) {
int cx = vector1[1] * vector2[2] - vector1[2] * vector2[1];
int cy = vector1[2] * vector2[0] - vector1[0] * vector2[2];
int cz = vector1[0] * vector2[1] - vector1[1] * vector2[0];
return {cx, cy, cz};
}
};
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算出这两个向量叉乘的结果
* @param vector1 int整型一维数组
* @param vector2 int整型一维数组
* @return int整型ArrayList
*/
public ArrayList<Integer> crossTimes(int[] vector1, int[] vector2) {
int cx = vector1[1] * vector2[2] - vector1[2] * vector2[1];
int cy = vector1[2] * vector2[0] - vector1[0] * vector2[2];
int cz = vector1[0] * vector2[1] - vector1[1] * vector2[0];
ArrayList<Integer> result = new ArrayList<>();
result.add(cx);
result.add(cy);
result.add(cz);
return result;
}
}
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 计算出这两个向量叉乘的结果
# @param vector1 int整型一维数组
# @param vector2 int整型一维数组
# @return int整型一维数组
#
class Solution:
def crossTimes(self, vector1, vector2):
x1, y1, z1 = vector1[0], vector1[1], vector1[2]
x2, y2, z2 = vector2[0], vector2[1], vector2[2]
cx = y1 * z2 - z1 * y2
cy = z1 * x2 - x1 * z2
cz = x1 * y2 - y1 * x2
return [cx, cy, cz]
算法及复杂度
- 算法: 基本算术运算。
- 时间复杂度:
。计算是基于一个固定的公式,只涉及常数次(6 次乘法,3 次减法)运算。
- 空间复杂度:
。返回的结果向量大小是固定的(3个整数),所以使用的额外空间是常数级别的。