题目链接

向量叉乘

题目描述

这是一个函数实现题。你需要实现一个 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 ]

实现步骤非常直接:

  1. 为了方便,我们将 vector1 的分量表示为 x1, y1, z1vector2 的分量表示为 x2, y2, z2
    • x1 = vector1[0], y1 = vector1[1], z1 = vector1[2]
    • x2 = vector2[0], y2 = vector2[1], z2 = vector2[2]
  2. 根据上述公式,分别计算出结果向量的三个分量 cx, cy, cz
  3. 创建一个新的包含 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个整数),所以使用的额外空间是常数级别的。